webpack打包

96 阅读3分钟

今天想给大家分析一下webpack的打包文件webpack.config.js

一.我把打包分为几步
1.设置入口

2.设置输出

3.loader

4.plugin

5.mode

6.浏览器兼容性

7.环境
二.如何构建一个webpack.config.js文件

1.设置入口

入口起点(entry point)  指示 webpack 应该使用哪个模块,来作为构建其内部 依赖图(dependency graph) 的开始。

module.exports = {  // 这里是commrnt.js语法
    // 入口文件
    entry:"./src/main.js",

2.设置输出

output 属性告诉 webpack 在哪里输出它所创建的 bundle,以及如何命名这些文件。主要输出文件的默认值是 ./dist/main.js,其他生成文件默认放置在 ./dist 文件夹中。

 output:{
        // 输出的路径  是绝对路径(导入path模块) 这里是用node来做的
        path:path.resolve(__dirname,'dist'),
        // 输出的文件名称
        filename:'build.js',
    },

3.loader

webpack 只能理解 JavaScript 和 JSON 文件,这是 webpack 开箱可用的自带能力。loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效 模块,以供应用程序使用。

 // loader的配置
    module:{
        rules:[
            // 详细loader配置

            // 打包css的配置
            {
                // 使用正则表达式,匹配那些文件
                test: /\.css$/,
                use:[
                    // use数组中loader执行顺序, 从右到左, 从下到上, 依次执行
                    // 创建style标签, 将js中的样式资源插入进行, 添加到head中生效
                    'style-loader',
                    // 将css文件变成commitjs模块加载js中, 里面的内容是样式字符串
                    'css-loader'
                ]
            },
            // 打包scss的配置
            {
                test: /\.scss$/,
                // 注意 是sass-loader ,不是 scss-loader
                // 是数组,代表的是要使用多个loader处理,用use
                use: [ 
                    'style-loader', 
                    'css-loader', 
                    // 将scss文件编译成css文件
                    'sass-loader' 
                ]
            },
            {
                // 问题:默认处理不了html中img图片
                // 处理图片资源
                test: /\.(jpg|png|gif)/,
                // 使用一个loader时,直接写就行了
                loader:'url-loader',
                options:{
                    // 图片大小小于8KB,就会被base64处理
                    // 优点:减少请求数量(减轻服务器压力)
                    // 缺点:图片体积会增大, 就会导致文件请求速度更慢
                    limit: 8 * 1024,
                    // 问题: 因为url-loader默认使用es6模块化解析, 
                    // 而html-loader引入图片commonjs
                    // 解析时会出问题: [object Module]
                    // 解决: 关闭url-loader的es6模块化, 使用commonjs解析
                    esModule: false,
                    // 给图片进行重命名
                    // [hash:10]取图片的hash的前10位
                    // [ext]去文件原来扩展名
                    name: '[hash:10].[ext]'
                }
            },
            {
                test: /\.(eot|ttf|svg|woff)$/,
                use: {
                loader: 'file-loader',
                options: {
                  // 打包后的字体图标放在 icon 目录下
                  // 文件名跟格式和打包前保持一致
                  name: 'icon/[name].[ext]',
                 }
                }
              },
              
            {
                test:/\.html$/,
                // 处理html文件的img图片 (负责引入img, 从而能被url-loader进行处理)
                loader:'html-loader'
            }
        ]
    },

4.plugin

loader 用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量。

 // plugins的配置
    plugins:[
        // 详细plugins的配置

        // 因为是直接引的,所以 new 就好了
        // 功能:默认会创建一个空的HTML文件,自动引入打包输出的所有资源(JS/CSS)
        new HtmlWebpackPlugin({
			// 复制 './src/index.html'文件,并自动引入打包输出的所有资源(JS/CSS)
			template:'./src/index.html'
		})
    ], 

5.模式

通过选择 developmentproduction 或 none 之中的一个,来设置 mode 参数,你可以启用 webpack 内置在相应环境下的优化。其默认值为 production

 // 使用开发模式打包
    mode:"development"
  1. 浏览器兼容性

Webpack 支持所有符合 ES5 标准 的浏览器(不支持 IE8 及以下版本)。webpack 的 import() 和 require.ensure() 需要 Promise。如果你想要支持旧版本浏览器,在使用这些表达式之前,还需要 提前加载 polyfill

7.环境

Webpack 5 运行于 Node.js v10.13.0+ 的版本。