基础webpack配置
// webpack.config.jsconst path = require('path')const htmlWebpackPlugin = require('html-webpack-plugin')const {CleanWebpackPlugin} = require('clean-webpack-plugin')module.exports = { // 单入口spa entry: './src/index.js', // 多入口mpa //entry: { // index: './src/index.js', // login: './src/login.js' //}, mode: 'development', output: { path: path.resolve(__dirname, './dist'), filename: '[name].js' }, module: { rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'], }, ] }, plugins: [ new htmlWebpackPlugin({ template: './src/index.html', filename: 'index.html' }), new CleanWebpackPlugin(), ]}
思考题
1. hash, chunkhash, contenthash的区别
- hash跟整个项目的构建相关,只要项目的文件发生更改,整个项目构建的hash值都会发生更改,并且全部文件相同的hash值
- chunkhash,由于采用hash每一次构建生成的值不一样,即使文件内容没有发生变化,无法实现缓存的效果,而chunkhash 是根据不同的入口文件进行依赖解析,构建单独的chunk, 生成对应的哈希值,在项目中把一些公共库和程序入口文件分开,采用chunkhash单独构建,只要不改动公共库的代码,就可以保持其哈希值不会受影响
- contenthash, 由于chunkhash的同一个模块将js和css分离,其哈希值也是相同的,修改一处,js和css的哈希值都会变,无法做到很好缓存,而contenthash表示由文件的内容产生的值,内容不同产生的contenthash值也不一样,项目中通常把css抽离出对应的css文件加以引用
- 小结,对于缓存的友好度:contenthash > chunkhash > hash
2. 谈谈对bundle, chunk, moulde的区别
- 开发中项目源码中的一个个文件,无论是ESM还是CommonJS或者是AMD的模块规范,都是属于module
- 当开发中的module源文件被webpack进行打包时,webpack会根据文件的引用关系生成chunk文件,webpack会给这些chunk生成对应的id用于后续操作
- webpack处理好chunk文件,最后会输出bundle文件,它包含经过加载和编译的最终源文件,可以直接在浏览器运行
- 一般而言,一个chunk对应一个bundle, 但也有例外,如果使用MiniCssExtractPlugin从chunk 中抽离出css会生成单独的css bundle文件
- 小结,module, chunk 和 bundle其实是同一份代码在不同场景下的不同名字,开发者开发时写的代码就是module, webpack 处理代码是就是chunk, 最后生成在浏览器可以直接运行的代码就是bundle