entry
1. './src/index.js' 单入口,形成一个 chunk 文件,输出一个 bundle 文件 chunk 名称默认为 main2. ['./src/index.js', './src/some.js'] 多入口,形成一个 chunk 文件,输出一个 bundle 文件,some.js 会被打包进 index.js 应用:HMR 使得 html 热更新生效3. { index: './src/index.js', some: './src/some.js' } 多入口,有几个入口文件,就形成几个 chunk 和 bundle,[name] 为 key4. { react: ['react', 'react-dom', 'react-router'], index: './src/index.js' } 形成两个 chunk 两个 bundle,react 相关的都打包在一块
output
output: { // 文件路径+文件名 filename: 'js/[name].[contenthash:8].js', // 输出文件目录,将来所有资源输出的公共目录 path: resolve(__dirname, 'build'), // 所有资源的公共路径前缀,通常用在生产环境,'/' 指的是根目录, // eg:若静态资源存放在服务器根目录的public目录下,则配置 '/public', 若发到cdn上,则配置cdn publicPath: '/public', // 非入口chunk的名字,两种可能:import 动态引入的;配置 optimization.splitChunks.chunks = 'all' 打包 node_modules 的chunk chunkFilename: 'js/[name]_chunk.js', // 整个库向外暴露的变量名,一般用作公共库才配置这个,通常配合 dll 使用 library: '[name]', // 向外暴露的变量添加到哪里,可以选择 window | global | commonjs | amd ... libraryTarget: 'window', },
module
module: { rules: [ { test: /\.css$/, // 多个loader use: [ 'style-loader', 'css-loader', { loader: 'post-css', options: {} }, ], }, { test: /\.js$/, // 单个loader loader: 'eslint-loader', // 优先执行,post 为延后执行 enforce: 'pre', exclude: /node_modules/, include: resolve(__dirname, 'src'), // 个性化配置 options: {}, }, ], },
resolve
// 解析模块规则 resolve: { // 路径别名 alias: { '@': resolve(__dirname, 'src'), }, // 省略文件的后缀名 extensions: ['.js', 'json', '.jsx', '.tsx', '.ts'], // 告诉webpack解析模块去找那个目录 modules: [__dirname + 'node_modules', 'node_modules'], },
devServer
devServer: { // 项目构建后路径 contentBase: resolve(__dirname, 'build'), // 监视 contentBase 下的文件,一旦有变化就 reload watchContentBase: true, watchOptions: { ignored: /node_modules/, }, // 开启gzip压缩 compress: true, host: 'localhost', port: 3333, // 自动打开浏览器 open: true, // 开启 HMR hot: true, // 不显示启动服务器的日志信息(控制台不打印) clientLogLevel: false, // 除了一些基本的信息,其他的内容都不显示(控制台不打印) quiet: true, // 如果出错了,不全屏显示 overlay: false, // 开发代理,解决开发环境跨域问题 proxy: { '/api': { target: 'http://localhost:8888', // 重写请求路径,'/api/xxx' -> '/xxx' pathRewrite: { '^/api': '', }, }, }, },
optimization
optimization: { splitChunks: { chunks: 'all' ... // 下面的默认配置如下面图片上所示,可以不写 // 图截的不全,上面还有个 minSize: 30 * 1024 , 分割的chunk最小为30kb }, // 解决场景:index.js 文件引入了 a.js 和 b.js, a.js 改变了会导致 index.js contenthash 改变,导致 index.js 的缓存失效 // 下面的配置,可以单独为改变的模块(这里指的是 a.js)单独生成一个 runtime 文件 runtimeChunk: { name: (entryPoint) => `runtime-${entryPoint.name}`, }, // 配置生产环境的压缩方案:js 和 css,有默认的配置,可以在这里自定义配置 minimizer: [ // webpack 4.26.x 以上,使用 terser-webpack-plugin 压缩 js // 要修改默认的配置,需要安装 npm i terser-webpack-plugin -D new TerserWebpackPlugin({ // 开启缓存 cache: true, // 开启多进程打包 parallel: true, // 开启 source-map sourceMap: true, }), ],}
