【前端】Webpack相关(长期更新)

webpack----前端打包工具

将多个模块的按依赖关系打包成一个或多个静态资源。

功能:模块打包、通过loader进行文件转换、代码拆分按需加载、扩展插件。

webpack主要包括 入口、输出、加载器、插件。

通过entry入口配置依赖;

通过output指定打包后输出文件命名及路径;

webpack本身只能处理js,通过loader可以处理css等其他类型文件;

通过plugins可以在打包时执行特定任务,比如 代码压缩、生成html文件等;

webpack5搭建:

1、npm init // 在空文件夹初始化package.json

2、npm install webpack webpack-cil //安装webpack及webpack-cil依赖包;

3、在utils中index.js写export const的一些通用方法;

4、在main.js中将3的方法导入,import {} from './utils/index';

5、在public中新建index.html,可通过!+Enter快捷键迅速搭建html基本框架,并修改title,在body写入id=app的div;

正式进入配webpack:

6、在webpack.config.js配置入口文件:

javascript 复制代码
const webpack = require('webpack');

module.exports = {
    //指定为开发模式,dev开发,pro生产,开发模式不会执行代码压缩和优化,生产会
    mode:'dev',                                
    entry:{ main: './src/main.js'},            //入口文件
    output:{                                   //出口文件
        path:path.resolve(__dirname, 'dist'),  //__dirname,为当前文件的绝对路径
        //使用由生成的内容产生hash,输出在dist文件夹的chunk.js下
        filename: 'js/chunk-[contenthash].js'    
    }
}

安装开发服务器:npm install --save-dev webpack-dev-server

javascript 复制代码
//const webpack = require('webpack');

module.exports = {
//    mode:'dev',                                //指定为开发模式,dev开发,pro生产
//    entry:{ main: './src/main.js'},            //入口文件
//    output:{                                   //出口文件
//        path:path.resolve(__dirname, 'dist'),  //__dirname,为当前文件的绝对路径
        //使用由生成的内容产生hash,输出在dist文件夹的chunk.js下
//        filename: 'js/chunk-[contenthash].js'    
//    }
    devServer: {
        contentBase:path.join(__dirname, 'dist'), 
        compress: true,
        port: 8080,    
    }
}

7、在package.json中创建一个运行webpack的构建脚本:在scripts中添加

eg: build: 'webpack'

8、在终端运行:npm run build,目录生成dist文件夹及目录下的chunk文件

要添加插件,生成html:

9、npm install html-webpack-plugin -D //安装插件

10、在webpack.config.js引入:

javascript 复制代码
//const webpack = require('webpack');

const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
//    mode:'dev',                                  //指定为开发模式
//    entry:{ main: './src/main.js'},              //入口文件
//    output:{                                     //出口文件
//        path:path.resolve(__dirname, 'dist'),    //__dirname,为当前文件的绝对路径
        //使用由生成的内容产生hash,输出在dist文件夹的chunk.js下
//        filename: 'js/chunk-[contenthash].js'    
//    },
    //可能插入多个插件,所以是数组形式
    plugins: [
        new HtmlWebpackPlugin({
            template:'./public/index.html  //指定模板文件
            filename:'index.html',    //打包后生成名称
            inject:'body'        //js插入body
        })
    ],
}

要添加css文件,进行加载:

11、在src/style/page.css书写通用样式;

12、在main.js引入:import './style/page.css';

13、npm install css-loader style-loader // 安装loader依赖包处理css文件

14、在webpack.config.js添加:

javascript 复制代码
//const webpack = require('webpack');

//const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
//    mode:'dev',                                  //指定为开发模式
//    entry:{ main: './src/main.js'},              //入口文件
//    output:{                                     //出口文件
//        path:path.resolve(__dirname, 'dist'),    //__dirname,为当前文件的绝对路径
        //使用由生成的内容产生hash,输出在dist文件夹的chunk.js下
//        filename: 'js/chunk-[contenthash].js'    
//    }
    //可能插入多个插件,所以是数组形式
//    plugins: [
//        new HtmlWebpackPlugin({
//            template:'./public/index.html  //指定模板文件
//            filename:'index.html',    //打包后生成名称
//            inject:'body'        //js插入body
//        })
//    ],
    module: {
        rules:[
            {
                test: /\.css$/, //正则匹配css文件
                // 从后往前加载,先css-loader,再style-loader
                use: ['style-loader','css-loader']
            }
        ]
    }
}

处理图像资源:

15、在src新建images存放图片

16、在main.js中引入:

javascript 复制代码
import img from './images/img.jpg'

const image = document.createElement('img');
image.src = img;
document.body.appendChild(image);

17、npm i file-loader url-loader -D

18、在webpack.config.js添加配置:

javascript 复制代码
//const webpack = require('webpack');

//const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
//    mode:'dev',                                  //指定为开发模式
//    entry:{ main: './src/main.js'},              //入口文件
//    output:{                                     //出口文件
//        path:path.resolve(__dirname, 'dist'),    //__dirname,为当前文件的绝对路径
        //使用由生成的内容产生hash,输出在dist文件夹的chunk.js下
//        filename: 'js/chunk-[contenthash].js'    
//    }
    //可能插入多个插件,所以是数组形式
//    plugins: [
//        new HtmlWebpackPlugin({
//            template:'./public/index.html  //指定模板文件
//            filename:'index.html',    //打包后生成名称
//            inject:'body'        //js插入body
//        })
//    ],
    module: {
        rules:[
            //{
            //    test: /\.css$/, //正则匹配css文件
                // 从后往前加载,先css-loader,再style-loader
            //    use: ['style-loader','css-loader']
            //}
            {
                test:/\.(png|jpg|gif|jpeg|webp|svg|ico)$/, // 正则匹配图片文件
                type:'asset',    // 使用asset模块
                generator:{    //生成输出文件-配置输出文件名
                    filename:'img/[name].[hash:6][ext]'
                },
                parser:{    //匹配图片大小
                    dataUrlCondition:{maxSize:10*1024}  //图片大小小于10kb
                }
            }
        ]
    }
}

每次执行npm run build生成的js文件实现覆盖:

19、在webpack.config.js的output里配置:

javascript 复制代码
//const webpack = require('webpack');

//const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
//    mode:'dev',                                  //指定为开发模式
//    entry:{ main: './src/main.js'},              //入口文件
    output:{                                     //出口文件
//        path:path.resolve(__dirname, 'dist'),    //__dirname,为当前文件的绝对路径
        //使用由生成的内容产生hash,输出在dist文件夹的chunk.js下
//        filename: 'js/chunk-[contenthash].js',    
        clean:true
    }
    //可能插入多个插件,所以是数组形式
//    plugins: [
//        new HtmlWebpackPlugin({
//            template:'./public/index.html  //指定模板文件
//            filename:'index.html',    //打包后生成名称
//            inject:'body'        //js插入body
//        })
//    ],
//    module: {
//        rules:[
            //{
            //    test: /\.css$/, //正则匹配css文件
                // 从后往前加载,先css-loader,再style-loader
            //    use: ['style-loader','css-loader']
            //}
//            {
//                test:/\.(png|jpg|gif|jpeg|webp|svg|ico)$/, // 正则匹配图片文件
//                type:'asset',    // 使用asset模块
//                generator:{    //生成输出文件-配置输出文件名
//                    filename:'img/[name].[hash:6][ext]'
//                },
//                parser:{    //匹配图片大小
//                    dataUrlCondition:{maxSize:10*1024}  //图片大小小于10kb
 //               }
//            }
//        ]
//    }
}
相关推荐
JieE21212 小时前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE21212 小时前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
爱勇宝13 小时前
鸿蒙生态的下半场:开发者不只要能开发,还要能赚钱
android·前端·程序员
IT_陈寒16 小时前
SpringBoot这个自动配置坑我跳了三次
前端·人工智能·后端
kyriewen16 小时前
我用 AI 一周写完了整个项目,上线第一天就崩了——这是我踩过最贵的 5 个坑
前端·javascript·ai编程
Larcher17 小时前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
默_笙17 小时前
🃏 JS 只有 8 种数据类型,但我花了 2 天才搞懂 null 和 undefined 的区别
javascript
牧艺17 小时前
从零到协同:构建类飞书在线文档系统的五个技术重难点
前端·人工智能
jump_jump17 小时前
流式 HTML:从 htmx 片段装配到浏览器原生增量渲染
javascript·性能优化·前端工程化
红尘散仙17 小时前
想写一个像样的终端 App?试试把 React 的开发体验搬进 Rust TUI
前端·rust