UNPKG

8-divine

Version:

![8-divine](static/divine.jpg)

103 lines (95 loc) 5.93 kB
const path = require("path"); const { merge } = require("webpack-merge"); const base = require("./webpack.config.base"); module.exports = merge(base, { // mode // 1. mode: 表示模式 // - development 开发环境 // - production 生产环境 // 这里的值在 package.json 中的 scripts 中的打包命令中通过 cross-env 来指定了 mode: process.env.NODE_ENV, target: "web", // entry // 1. entry 表示thunk的入口点 // 2. entry 的简单规则 // - html: 每个html都有 一个入口起点 // - 单页应用spa: 一个入口起点 // - 多页应用mpa: 多个入口起点 // 3. 如果entry后面跟一个 ( 字符串 ),或者 ( 字符串数组 ),chunk会被命名为 ( main ) ---- main // 4. 如果entry后面跟一个 ( 对象 ),则 ( key ) 就是 thunk名 -------------------------- key // 5. 如何打包一个多页应用 // - 1. entry设置为 ( 对象模式 ),则可以指定 ( 多个入口 ) // - 2. output的 ( filename ) 设置为 ('[name].[hash:8].js' ) 的形式,使用 ( 占位符 ) 则可以分别打包为不同的 ( 出口文件 ) // - 3. plugins 数组中需要多次 ( new HtmlWebpackPlugin() ),具体如下 // plugins: [ // new HtmlWebpackPlugin({ // ---------------------------- html-webpack-plugin可以new多个 // template: './src/index.html', // 模版html // filename: 'home.html', // 打包后的html文件名 // chunks: ['home'] // --------------------------------- 每个chunk对应加载哪些打包后的 js 文件,即 output指定的输出js文件 // }), // new HtmlWebpackPlugin({ // template: './src/index.html', // filename: 'other.html', // chunks: ['other'] // }), // ] entry: { index: "./examples/main.js", }, // output // 1. filename // - filename: 表示打包后的 thunk 的名字 // - '[name].[hash:8].js' // - []: 表示占位符 // - [name]: 表示使用 entry 属性对象中的 key 作为thunk名 // - [hash:8]: 表示加上hash串,长度为 8 // 2. path // - path: 表示打包生成的文件夹的路径 // 3. hash chunkhash contenthash 之间的区别? // - hash // - 作用:只要项目中有文件修改,整个项目构建的hash都会改变,并且全部文件都共用相同的hash // - 弊端:如果只修改了一个文件,整个文件的缓存都将失效,因为真个文件的hash都改变了 // - chunkhash // - 相对于hash,chunkhash的影响范围较小 // - 原理: // - 根据不同的入口文件(Entry)进行依赖文件解析、构建对应的chunk,生成对应的哈希值 // - 不同入口打包生成的chunk的hash不一样 // - 测试 // - 请使用 cnpm run build 进行 chunkhash 的测试,main和other的js文件的hash值就不一样 // - 例子: // - 策略:比如一个项目有6个组件,123打包为一个thunk1输出一组js/css,456打包为另一个thunk2输出另一组js/css // - 结果: 如果使用chunkhash,打包完成后chunk1的hash和chunk2的hash就不一样,改动了123,456的chunk2的hash就不会变,缓存仍然有效 // - contenthash // - 1. 影响范围最小,在hash,chunkhash,contenthash三者中 // - 2. 遇到问题 // - 使用chunkhash,如果index.css被index.js引用了,那么 ( css文件和js文件 ) 就会 ( 共用相同的chunkhash值 ) // - 如果index.js更改了代码,css文件就算内容没有任何改变,由于是该模块发生了改变,导致css文件会重复构建 // - 3. 解决方法 // - 使用 ( mini-css-extract-plugin ) 里的 ( contenthash ) 值,保证即使css文件所处的模块里就算其他文件内容改变,只要css文件内容不变,那么不会重复构建 // - 总结 // - hash(任何一个文件修改,整个打包所有文件的hash都会改变): - 是根据整个项目构建,要项目里有文件更改,整个项目构建的hash值都会更改,并且全部文件都共用相同的hash值 // - chunkhash(只影响到不同entry划分的chunk):chunkhash根据不同的入口文件(Entry)进行依赖文件解析、构建对应的代码块(chunk),生成对应的哈希值,某文件变化时只有该文件对应代码块(chunk)的hash会变化 // - contentHash(即使是相同chunk的js和css,改动js只会影响对应的js而不会影响到css):每一个代码块(chunk)中的js和css输出文件都会独立生成一个hash,当某一个代码块(chunk)中的js源文件被修改时,只有该代码块(chunk)输出的js文件的hash会发生变化 // 4. 在哪些地方可以使用到 hash chunkhash contenthash // - 凡是在 webpack.config.js 中具有 ( filename ) 属性的地方都可以使用 ( 占位符的方式 [hash] ) 使用到这几种hash // 真正打包 output npm 相关的配置文件在:webpack.config.prod.js output: { filename: "[name].[hash].js", path: path.resolve(process.cwd(), "dist"), // 等价于 path: path.resolve(__dirname, "../dist") // path: path.resolve(__dirname, "../dist"), // __dirname这里表示 webpack.config.dev.js 文件所在的文件夹,即build文件夹 // 1 // path.resolve() 返回一个 绝对路径 // __dirname 当前模块的目录名 // __filename 当前模块的文件名 // 2 // process.cwd() ---> 表示 执行node命令所在的目录文件夹 // __dirname -------> 表示 源代码所在的目录文件夹 }, devServer: { // contentBase 改成 static static: "../dist", hot: true, open: true, compress: true, // 开启 gzip 压缩 }, });