webpack 配置详情

97 阅读4分钟

webpack 配置详情

entry

配置 webpack.config.js

// webpack.config.js
​
​
const { resolve } = require ('path')
​
const HtmlWebpackPlugin = require ('html-Webpack-plugin')
module.exports = {
    
    entry: './src/index.js',
    
    output: {
        filename: 'built.js',
        path: resolve (__dirname, 'build')
    },
    
    plugins: [
        // 生成一个html, 引入打包后的 Css 和 js 文件
        new HtmlWebpackPlugin ()  
    ],
    
    mode: 'development' // 模式:开发环境
    
}

entry: 入口起点

单入口

string ---> './src/index.js'

打包形成一个 chunk, 输出一个 bundle 文件。

此时 打包chunk 的名字 默认值 是 main

entry: './src/index.js'

多入口

array ---> [ './src/index.js', './src/add.js' ]

所有入口文件最终只会形成 一个 Chunk,

输出出去只有一个 bundle 文件。

使用场景:html热更新

打包的 chunk 默认名: main

entry: ['./src/index.js', './src/add.js']

object ----> { index: './src/index.js', add: './src/add.js' }

或者

{ // 多个入口最终生成一个chunk

index: ['./src/index.js', './src/count.js']

// 生成一个chunk

add: './src/add.js'

}

有几个 文件入口就形成几个 chunk, 输出几个 bundle 文件

此时 key 就是 chunk 的名字

entry : {
          index: './src/index.js',
          add: './src/add.js'
}
​
# 或者  特殊用法
entry : {
          // 多个入口最终生成一个chunk    
          index: ['./src/index.js', './src/count.js']    
​
          // 生成一个chunk    
          add: './src/add.js' 
}

output

// webpack.config.js
​
​
const { resolve } = require ('path')
​
const HtmlWebpackPlugin = require ('html-Webpack-plugin')
module.exports = {
    entry: './src/index.js',
    
    // 打包出口
    output: {
        // 文件名称(目录 + 名称)
        filename: 'js/[name].js',
        // 所有资源输出的公共目录
        path: path.resolve(__dirname, 'dist'),
​
        // 所有输出资源引入公共路径前缀
        publicPath: '/'
        // 非入口chunk的名称
        chunkFilename: [name]_chunk.js,
        // 整个库对外暴露的变量名
        library: '[name]',
         // 变量名添加到哪个变量上 window(browser), global(node)
        libraryTarget: 'window', // 'global'、'commonjs'
​
    },
    
    plugins: [
        // 生成一个html, 引入打包后的 Css 和 js 文件
        new HtmlWebpackPlugin ()  
    ],
​
    mode: 'development' // 模式:开发环境
​
}

module

// webpack.config.js
​
module.exports = {
​
    // Loader 配置
    module: {
        rules: [
            // loader 的配置
​
            {
                test: /.css$/,
                // 多个loader 用 use
                use: ['style-loder','css-loader']
​
                // 或者
​
                use: [
                        { loadr:'style-loder' },
                        { loader:'css-loader
                     ]
            },
​
            {
​
                test: /.js$/,
​
                // 排除 node_module 文件, 不检查  node_module 下的 js 文件
                exclude: /node_module/,
​
                // 只检查 src 下的 js 文件
                include: resolve (__diename,'src'),
​
                // 优先执行
                enforce: 'pre',
​
                // 延后执行
                enforce: 'post',
​
                // 单个loader 用 loader
                loader: 'eslint-loader',
                option: {}
​
                // 以下配置只会生效一个
                oneOf: []
​
​
            }
​
        ]
​
    }
​
}

resolve

// webpack.config.jsmodule.exports = {
    
    //  解析模块的规则
    resolve: {
        // 配置解析模块的路径别名
        // 优点:编码时简写路径
        // 缺点:没有路径提示
        alias: {
            '@': path.resolve(__dirname, 'src')
        },
​
        // 配置省略文件路径的后缀名
        extensions: ['.js', '.json', '.css'],
​
        // 告诉webpack解析模块去哪个目录找
        modules: ['node_modules'],
​
        //  绝对路径 告诉webpack解析模块去哪个目录找
        modules: [reslove(__diename,'../../node_mo')'node_modules']
    },
​
​
}

dev server

// webpack.config.jsmodule.exports = {
   
    // 开发服务器配置, 不要用于生产服务器
    devServer: {
        // 运行代码的目录
        contentBase: resolve(__dirname, 'dist'),
        
        // 监视contentBase目录下文件,一旦变化就reload
        watchContentBase: true,
        
        watchOptions: {
            // 忽略文件
            ignored: /node_modules/
        },
​
        // 启动gzip压缩
        compress: true,
        
        // 端口号
        port: 5000,
        
        // 域名
        host: 'localhost',
        
        // 自动打开浏览器
        open: true,
        
        // 开启HMR
        hot: true,
        
        // 不要显示启动服务器日志信息
        clientLogLevel: 'none'
        
        // 除了一些基本启动信息外,其他内容都不要显示
        quiet: true,
        
        // 如果出错,不要全屏提示
        overlay: false,
        
        // 服务器代理,解决开发环境跨域问题
        // 浏览器和服务器之间是有跨域,但是服务器和服务器之间是没跨域的
        // 浏览器和代理服务器之间是没有跨域问题的
        proxy: {
            // 一旦接收 /api 开头的请求,就会把请求转发到另一个服务器
            '/api': {
                target: 'http://localhost:3000',
        
                // 发送请求时,请求路径重写, 将/api/xxx 写成 /xxx (去掉 /api) 
                pathRewrite: {
                    '^/api': ''
                }
            }
        }
    },
​
}

optimization

// webpack.config.jsconst TerserWebpackPlugin = require ('terser-webpack-plugin')
​
module.exports = {
   
    // optimization 必须要在生产环境配置才有意义
​
    //  优化配置
    optimization: {
        // 提取公共代码 代码分割
        splitChunks: {
            chunks: 'all',
           
            // 一下均为默认值,可以不写
            // 分割的chunk最小为30kb (文件大小必须是大于30KB,小于30KB是不提取的)
            minSize: 30  * 1024, 
            
            // 最大没有限制
            maxSize: 0, 
            
            // 要提取的chunk最少被引用1次
            minChunks: 1
            
            // 按需加载时并行加载文件的最大数量
            maxAsyncRequests: 5,
            
            // 入口文件最大并行请求数量
            maxInitialRequests: 3,
            
            // 名称连接符
            automaticNameDelimiter: '~'
            
            // 可以使用命名规则
            name: true,
            
            // 分割chunk的组
            cacheGroups: {
            
                // node_modules 文件会被打包到vendors组的chunk中:                             verdors~xxx.js
                // 满足上面的公共规则,如:大小超过30kb,至少被引用1次
                verdors: {
                    test: /[\/]node_modules[\/]/,
            
                    // 优先级
                    priority: -10
                },
        
                default: {
                    
                    // 至少被引用2次
                    minChunks: 2,
                    
                    // 优先级
                    priority: -20,
                    
                    // 如果当前要打包的模块,和之前已经被提取的模块是同一个,就会复                       用,而不是重新打包模块
                    reuseExistingChunk: true
                }
            }
            
            /********* 上面的配置都可以使用默认值, 一般不会去修改 ***********/
    
        },
    
        // 将当前模块的记录其他模块的 hash 单独打包为一个文件 runtime
        // 解决: 修改a文件,导致b文件的 contenthash 变化,导致缓存失效
        runtimeChunk: {
            name: entrypoint => `runtime-${entrypoint.name}`
        },
​
        //  配置生产环境的压缩方案:js和css
        minimizer: [
            // webpack verson > 4.26 
            new TerserWebpackPlugin({
                // 开启缓存
                cache: true,
                
                // 开启多进程打包
                parallel: true,
                
                // 启动source-map
                sourceMap: true
            })
        ]
    },
​
}