UNPKG

8-divine

Version:

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

253 lines (241 loc) 9.99 kB
const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const VueLoaderPlugin = require("vue-loader/lib/plugin"); const webpack = require("webpack"); // 1 // cross-env // - 在 package.json 中设置了 "dev:development": "cross-env NODE_ENV=development webpack --config build/webpack.config.js" // - "cross-env NODE_ENV=development" -> 表示的是设置 NODE 环境中的 process.env.NODE_ENV 环境变量的值为 development // - process.env.NODE_ENV 作用就是访问 node环境的 NODE_ENV 环境变量 console.log(`process.env.NODE_ENV`, process.env.NODE_ENV); console.log(`process.env.HOST_ENV`, process.env.HOST_ENV); // 2 // 真实项目的环境变量的设置 // webpack3 // (1) 现在 package.json 中通过 cross-env 插件设置 ( NODE ) 环境变量 // - cross-env NODE_ENV=development // - 在node环境中可以通过 process.env.NODE_ENV 来获取 // (2) 在 webpack.config.js 中通过 webpack.DefinePlugin 将 ( 浏览器 ) 环境变量设置为 第一步设置的值 // - webpack.config.js 中的 webpack.definePlugin 中设置 "process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV) // - 表示将浏览器环境中的 process.env.NODE_ENV 设置为 node环境中的 process.env.NODE_ENV // (3) 这样 浏览器环境 和 node 环境中的值就同步了,都是为 cross-env 指定的值 // webpack4 // (1) webpack4中可以直接设置:mode 属性 // - mode:development // - 相当于:webpack.definedPlugin({'process.env.NODE_ENV': JSON.stringify('development')}) // console.log(`NAME`, NAME); // 报错了,说明 webpack.DefinePlugin 中定义的环境变量只能在浏览器环境中访问,即任何一个module中访问 // 前值知识 // 1 // RegExp // - regular expression 正则表达式 // - 两种方法声明正则表达式 // - 编译时运行新建正则 ----------- const regexp = /xyz/ // - 运行时新建正则 -------------- const regexp = new RegExp('xyz', '修饰符igm') // - 实例方法 // - RegExp.prototype.test() --- 返回一个布尔值,表示是否匹配参数字符串 // - 字面量字符 和 元字符 // - 表示字面意思的字符称为字面字符 // - 表示特殊的含义,而不是表示字面意思 // - . 点字符,匹配除 回车\r 换行\n 行分割符 // - ^ $ 位置字符 // - | 选择符 表示or或关系;( /ab|cd/ ) 匹配 ( ab或cd,而不是 b或c ) // - \\ \* // - + ? () [] {} 等 // - 正则表达式中需要转译的字符,一共12个 // - ^、.、[、$、(、)、|、*、+、?、{ 和 \\ // - 我们调整一下顺序: // 点字符. // 位置字符^$ // 选择符| // 量词符*?+ // () [ { \\ // - 预定义模式 // - \d [0-9] digit // - \D [^0-9] // - \w [a-z0-9A-Z_] // - \W [^a-z0-9A-Z_] // - \s [ \t\r\n\v\f] // - \S // - \b 单词边界,boundary // - \B 匹配非词边界,即在词的内部 // - 字符类 // - [abc] 表示只要匹配其中一个字符就可以 // - 脱字符 ^ // - [^xyz]表示除了x、y、z之外都可以匹配 // - [^],就表示匹配一切字符 // - 连字符 - // - 连续序列的字符 // - [abc]可以写成[a-c] // - 重复类 // - {n}表示恰好重复n次 // - {n,}表示至少重复n次 // - {n,m}表示重复不少于n次,不多于m次 // - 量词符 // - ? 问号表示某个模式出现0次或1次,等同于 {0, 1} // - * 星号表示某个模式出现0次或多次,等同于 {0,} // - + 加号表示某个模式出现1次或多次,等同于 {1,} // - 贪婪模式 var s = 'aaa'; // - s.match(/a+/) // ["aaa"] // - 非贪婪模式 // - s.match(/a+?/) // ["a"] // - *?:表示某个模式出现0次或多次,匹配时采用非贪婪模式 // - +?:表示某个模式出现1次或多次,匹配时采用非贪婪模式 // - 为什么 ? 没有非贪婪模式,因为是0个或者1个,本来就不贪婪 // 2 // webpack优化 // 2.1 noParse // - module.noParse // - 当安装的第三方库没有依赖其他库时,是不需要去寻找解析第三方库的依赖关系,提高构建速度 // module: { // noParse: /jquery|lodash/, // ------ 不去解析jquery或lodash的依赖关系,因为它们俩都没有依赖其他库,从而提高构建速度 // rules: [] // } // 2.2 include 和 exclude // - 在 module.rules 中去配置loader时,通过 include 和 exclude 来缩小寻找loader的范围 // - 因为在寻找loader时默认回去node_modules中去寻找,而我们真正要要loader处理的是我们自己开发的文件时,就可以通过 exclude 来缩小loader匹配的范围 // 2.3 DllPlugin 和 DllReferencePlugin // - DllPlugin // - 主要作用是:单独打包第三方包时,生成一个 json 任务清单,即生成动态链接库 // - name path // - DllReferencePlugin // - 主要作用是:引用动态连结库 // 2.3 懒加载 // - 安装 @babel/plugin-syntax-dynamic-import // - import().then() 即import函数返回一个promise,配合webpack的代码分割懒加载不同的chunk // 2.4 热更新 // - webpack.HotModuleReplacementPlugin -----> 负责热更新 // - webpack.NameModulesPlugin --------------> 打印更新模块的路径 // - devServer 中设置 hot: true // if (module.hot) { // module.hot.accept("./main.js", () => { // require("./main"); // }); // } module.exports = { // 1 // mode // 指定 浏览器环境中的环境变量,即不同的module模块中访问到 // - mode用来指定 webpack.DefinePlugin 中 process.env.NODE_ENV 的值,这样就能在浏览器环境中访问到,即module模块中访问到 // - 除了在 webpack.config.js 配置文件中使用,还可以通过 package.json 中的 scripts 标签来执行webpack命令,比如 webpack --mode=development // - mode指定的值,mode的值将会作为 webpack.DefinedPlugin({'process.env.NODE_ENV': JSON.stringify('mode的值')}),从而能在浏览器环境中访问NODE_ENV,即module中访问 // 2 // 浏览器和node环境,都可以通过 ( process.env.环境变量名 ) 来访问环境变量 // 3 // 浏览器中的环境变量有多少种指定的方式 ( 两种 ) // - mode 指定 // - webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify('NODE_ENV的值') }) mode: process.env.NODE_ENV, entry: { main: path.resolve(__dirname, "../examples/index.js"), // __dirname表示当前的文件所在的目录,即 webpack.config.js 文件所在的文件夹 }, // 真正打包 output npm 相关的配置文件在:webpack.config.prod.js output: { path: path.resolve(__dirname, "../dist"), filename: "[name].js", }, // devtool // eval-source-map:不产生source-map文件,但是调试时会显示行数 // source-map:产生source-map文件,显示行列信息 devtool: "eval-source-map", devServer: { static: { // 静态资源从之前的 contentBase 改成 static // path.resolve()生成一个绝对路径,__dirname返回当前代码所在的文件夹 // 这里static.directory 表示将dist文件夹中的文件打包起一个服务 directory: path.resolve(__dirname, "../dist"), }, port: 7777, compress: true, hot: true, }, // resolve // resolve.alias 取别名 // resolve.extensions 当import省略后缀时,先找.js文件,再找.css文件 resolve: { alias: { "@image": path.resolve(__dirname, "../examples"), // @image === 根/examples/ }, extensions: [".js", ".css", ".less", "*"], // ------------------------------------------------- import时省略后缀时,先找.js文件,再找.css文件 // ------------------------------------------------- 注意:'*' 表示所有类型的文件 }, module: { noParse: /jquery|lodash/, // ------ module.noParse 不去解析jquery或lodash的依赖关系,因为它们俩都没有依赖其他库,从而提高构建速度 rules: [ { test: /\.vue$/, use: { loader: "vue-loader", options: { // extractCSS: true, // 单独抽离css }, }, exclude: /node_modules/, }, { test: /\.js$/, use: [ { loader: "babel-loader", options: { presets: [["@babel/preset-env"]], plugins: [ ["@babel/plugin-proposal-decorators", { legacy: true }], // 装饰器语法 ["@babel/plugin-proposal-class-properties"], // 支持 class // proposal 是提案的意思 ], }, }, ], }, { test: /\.css$/, use: ["style-loader", "css-loader"], exclude: /node_modules/, }, { test: /\.s[ac]ss$/i, use: [ "style-loader", "css-loader", { loader: "sass-loader", options: {}, }, ], exclude: /node_modules/, }, { test: /\.(svg|otf|ttf|woff2?|eot|gif|png|jpe?g)(\?\S*)?$/, use: [ { loader: "url-loader", options: { limit: 8192, esModule: false, //“[object Module]”问题 outputPath: "img/", // 将图片资源打包到img文件夹中 }, }, ], exclude: /node_modules/, }, ], }, plugins: [ new HtmlWebpackPlugin({ title: "8-divine", template: "public/index.html", // 注意这里的路径问题 filename: "index.html", }), new VueLoaderPlugin(), new webpack.DefinePlugin({ NAME: JSON.stringify('"woow_wu7"'), "process.env.HOST_ENV": JSON.stringify(process.env.HOST_ENV), }), // new webpack.NameModulesPlugin(), new webpack.HotModuleReplacementPlugin(), ], optimization: { moduleIds: "named", }, };