webpack笔记-生产环境与开发环境常用plugin介绍(五)
mode 和 plugin
前边我们介绍 mode 时提过,mode 不同值会影响 webpack 构建配置,其中有一个就是会启用 DefinePlugin 来设置process.env.NODE_ENV 的值,方便代码中判断构建环境。
除此之外,development和 production两个不同的 mode 之间还有其他 plugin 使用上的区别,这里详细介绍一下:
development
development 下会启用 NamedChunksPlugin 和 NamedModulesPlugin,这两个 plugin 官方文档并没有详细的介绍,主要作用是在 Hot Module Replacement(热模块替换,后续简称 HMR)开启时,模块变化时的提示内容显示 chunk 或者 module 名称,而不是 ID。
production
production 下会启动多个 plugins,分别是:
- FlagDependencyUsagePlugin 在构建时给使用的依赖添加标识,用于减少构建生成的代码量。
- FlagIncludedChunksPlugin 在构建时给 chunk 中所包含的所有 chunk 添加 id,用于减少不必要的 chunk。
- ModuleConcatenationPlugin 构建时添加作用域提升的处理,用于减少构建生成的代码量,详细参考:module-concatenation-plugin。
- NoEmitOnErrorsPlugin 编译时出错的代码不生成,避免构建出来的代码异常。
- OccurrenceOrderPlugin 按使用的次数来对模块进行排序,可以进一步减少构建代码量。
- SideEffectsFlagPlugin 在构建时给带有 Side Effects 的代码模块添加标识,用于优化代码量时使用。
- TerserPlugin 压缩 JS 代码,参考:Terser。
production mode 下启用的大量 plugin都是为了优化生成代码而使用的,和配置的 optimization 的内容息息相关,详细可以查阅:optimization
下面介绍下其中用到的一些plugin的使用,帮我们理解plugin。
DefinePlugin
DefinePlugin 是 webpack 内置的插件,可以使用webpack.DefinePlugin 直接获取。
在不同的 mode 中,会使用 DefinePlugin 来设置运行时的 process.env.NODE_ENV 常量。DefinePlugin 用于创建一些在编译时可以配置值,在运行时可以使用的常量,如下例子:
module.exports = {
// ...
plugins: [
new webpack.DefinePlugin({
PRODUCTION: JSON.stringify(true), // const PRODUCTION = true
VERSION: JSON.stringify('5fa3b9'), // const VERSION = '5fa3b9'
BROWSER_SUPPORTS_HTML5: true, // const BROWSER_SUPPORTS_HTML5 = 'true'
TWO: '1+1', // const TWO = 1 + 1,
CONSTANTS: {
APP_VERSION: JSON.stringify('1.1.2') // const CONSTANTS = { APP_VERSION: '1.1.2' }
}
}),
],
}
有了上面的配置,就可以在应用代码文件中,访问配置好的常量了,如:
console.log("Running App version " + VERSION);
if(!BROWSER_SUPPORTS_HTML5) require("html5shiv");
对上面配置简单解释下:
- 如果配置的值是字符串,那么整个字符串会被当成代码片段来执行,其结果作为最终变量的值,如上面的
"1+1",最后的结果是2 - 如果配置的值不是字符串,也不是一个对象字面量,那么该值会被转为一个字符串,如
true,最后的结果是'true' - 如果配置的是一个对象字面量,那么该对象的所有 key 会以同样的方式去定义
这样我们就可以理解为什么要使用 JSON.stringify()了,因为 JSON.stringify(true)的结果是 'true',JSON.stringify("5fa3b9") 的结果是 "5fa3b9"。
社区中关于 DefinePlugin 使用得最多的方式是定义环境常量,例如 PRODUCTION = true或者 __DEV__ = true等
建议使用
process.env.NODE_ENV: ...的方式来定义process.env.NODE_ENV,而不是使用process: { env: { NODE_ENV: ... } }的方式,因为这样会覆盖掉process这个对象,可能会对其他代码造成影响。
TerserPlugin
webpack mode 为 production 时会启用 TerserPlugin 来压缩 JS 代码,我们看一下如何使用的:
module.exports = {
// ...
// TerserPlugin 的使用比较特别,需要配置在 optimization 字段中,属于构建代码优化的一部分
optimization: {
minimize: true, // 启用代码压缩
minimizer: [new TerserPlugin({
test: /\.js(\?.*)?$/i, // 只处理 .js 文件
cache: true, // 启用缓存,可以加速压缩处理
})], // 配置代码压缩工具
},
}
关于 TerserPlugin 的更多配置参考官方文档:terser-webpack-plugin。
在以前的版本 webpack 是使用
UglifyWebpackPlugin来压缩 JS 代码,后边更换为TerserPlugin了,可以更好地处理新的 JS 代码语法。
IgnorePlugin
IgnorePlugin和 DefinePlugin一样,也是一个webpack内置的插件,可以直接使用 webpack.IgnorePlugin来获取。
这个插件用于忽略某些特定的模块,让webpack不把这些指定的模块打包进去。例如我们使用 moment.js,直接引用后,里边有大量的 i18n 的代码,导致最后打包出来的文件比较大,而实际场景并不需要这些 i18n 的代码,这时我们可以使用 IgnorePlugin 来忽略掉这些代码文件,配置如下:
module.exports = {
// ...
plugins: [
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
}
IgnorePlugin 配置的参数有两个,第一个是匹配引入模块路径的正则表达式,第二个是匹配模块的对应上下文,即所在目录名。
webpack-bundle-analyzer
这个 plugin 可以用于分析 webpack 构建打包的内容,用于查看各个模块的依赖关系和各个模块的代码内容多少,便于开发者做性能优化。
webpack-bundle-analyzer是第三方的包,使用前需要安装,配置上很简单,仅仅引入 plugin 即可,在构建时可以在浏览器中查看分析结果:
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
// ...
plugins: [
new BundleAnalyzerPlugin(),
],
}
使用这个可以配合 IgnorePlugin 来过滤掉部分大而无用的第三方模块。
webpack笔记-生产环境与开发环境常用plugin介绍(五)的更多相关文章
- 【webpack学习笔记】a06-生产环境和开发环境配置
生产环境和开发环境的配置目标不一样,生产环境主要是让文件压缩得更小,更优化资源,改善加载时间. 而开发环境,主要是要开发更方便,更节省时间,比如调试比如自动刷新. 所以可以分开配置不同的开发环境,然后 ...
- (17/24) webpack实战技巧:生产环境和开发环境并行设置,实现来回切换
1. 概述 生产环境和开发环境所需依赖是不同: --开发依赖:就是开发中用到而发布时用不到的.在package.json里面对应的就是devDependencies下面相关配置. --生产依赖: 就是 ...
- Maven Filter与Profile隔离生产环境与开发环境
Maven Filter与Profile隔离生产环境与开发环境 在不同的开发阶段,我们一般用到不同的环境,开发阶段使用开发环境的一套东西,测试环境使用测试环境的东西,可能有多个测试环境,生产环境使用的 ...
- (24/24) webpack小案例--自己动手用webpack构建一个React的开发环境
通过前面的学习,对webpack有了更深的认识,故此节我们就利用前面相关知识自己动手用webpack构建一个React的开发环境,就算是一个小案例吧. 注:此处使用的开发工具是Webstorm. 1. ...
- vue cli3中配置生产环境、开发环境、测试环境
首先在packjson中配置 "scripts": { "serve": "vue-cli-service serve", //调用开发ap ...
- 通过Maven配置测试环境和开发环境连接不同的数据库
通过Maven配置测试环境和开发环境连接不同的数据库 作者及来源: 通灵宝玉 - 博客园 收藏到→_→: 此文来自: 马开东博客 网址:http://www.makaidong.com ...
- Android 程序分析环境搭建-开发环境搭建
1.1 JDK 安装 JDK 的配置,初学java 开发,那是必须会的. 下载,遇到的问题就是要注册oracle 的账号,还有你要下载特定版本,比如jdk 1.7,jdk 1.6,很难找到在哪里.解 ...
- 【webpack学习笔记】a04-建立开发环境
开发环境就是在开发过程中为了方便配置的环境,生产环境就是开发完成即将上线的情况. 好了,说了句废话,切入正题. 在开发时,打包后的文件压缩成一团,报错调试的时候傻眼了有木有?每次做出修改需要到浏览器查 ...
- 基于webpack和vue.js搭建开发环境
前言 在对着产品高举中指怒发心中之愤后,真正能够解决问题的是自身上的改变,有句话说的好:你虽然改变不了全世界,但是你有机会改变你自己.秉承着“不听老人言,吃亏在眼前”的优良作风,我还是决定玩火自焚. ...
- spring boot区分生产环境和开发环境
回顾一下spring boot使用基础,做个笔记. 通过配置文件,设置项目的开发环境和生成环境. 项目目录结构: application-dev.yml是开发环境配置文件,application-pr ...
随机推荐
- Dotnet算法与数据结构:Hashset, List对比
哈希集A 是存储唯一元素的集合.它通过在内部使用哈希表来实现这一点,该哈希表为基本操作(如添加.删除和包含)提供恒定时间平均复杂度 (O(1)).此外,不允许重复元素,使其成为唯一性至关重要的场景的理 ...
- k8s 实战 3----标签
如果你对k8s还不了解,可以看下前文k8s 实战 1 ---- 初识 (https://www.cnblogs.com/jilodream/p/18245222)k8s 实战 2 ---- pod 基 ...
- SqlParameter,参数化查询问题
SqlParameter p = new SqlParameter("@pageIndex", (object)pageIndex); SqlParameter带有两个参数的构造函 ...
- MakeSense标注指南
1.网址 https://www.makesense.ai/ 2.操作流程 2.1 导入 点击get started 点击drop images,上传图片 选择obeject detection 新建 ...
- vue --version 显示的却是vue cli的版本号,为什么?
vue --version 显示的却是vue cli的版本号,为什么? 如果您在运行 vue --version 命令时显示的是 Vue CLI 的版本号,而不是 Vue.js 的版本号,那可能是因为 ...
- 【服务器】Ubuntu虚拟内存设置
引子 最近服务器内存老是爆掉,64G的内存对于四五个人同时使用还是有点勉强,上网查询了一下虚拟内存的教程,本博客记录一下方法. swap内存设置 假设你想将swap文件放在/mnt/data/mem目 ...
- 对比python学julia(第三章:游戏编程)--(第二节)公主迎圣诞(4)
4. 碰撞检测 .得分及生命 在第 4 个阶段,利用GameZero的碰撞检测功能,使公主角色能够接到雪花 .礼物或剪刀. 在"sdgz"项目目录中 ,把 version3.jl ...
- 【Git】Git拉取失败,报错超出内存,内存分配失败
报错信息: Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\Administr ...
- 【Spring-Security】Re09 CSFR处理
一.CSRF: CSRF 全称 Cross Site Request Forgery 跨站请求伪造 又称为OneClick Attack & SessionRiding 是非法请求访问,通过伪 ...
- 2024年世界体育界的第一大丑闻:利昂内尔·梅西 (The biggest scandal in the world of sports in 2024: Unethical player - Lionel Messi.)
无德球员,梅西亲日辱华,不顾球迷感受,拒绝在中国的比赛中上场,并以所谓的伤病为借口,却在3天后的日本比赛中完全恢复如初,并进行了30分钟的高强度的对抗比赛并射门,可以说梅西的这一行径就是对中国亿万百姓 ...