webpack学习笔记
webpack可以解决什么问题
基本使用方法
安装
配置package.json文件:
1 | |
执行npm install安装。
配置
通用基础配置
放在webpack.config.base.js文件中。
1 | |
环境差异化配置
比如开发环境,会新建一个webpack.config.dev.js文件,里面可以这样配置:
1 | |
压缩文件
由于uglifyjs不兼容ES6语法,所以一般采用terser-webpack-plugin这个插件来执行压缩操作。
注意:如果你webpack的版本是4.X,那么terser-webpack-plugin也需要改为4.X的版本,否则如果用了高版本的terser-webpack-plugin,会报错。
如果是webpac5,则默认就已经有terser-webpack-plugin了,无需重新安装。
另外entry配置默认不支持通过正则表达式读取多个文件,可以引入glob这个包来扩展支持。
下面这个例子我自己添加了文件的读写功能,目的是将多个js文件整合到一个js文件中,进行打包压缩。之所以不通过glob直接设置,是因为我发现单个js文件如果只包含变量定义,压缩后会丢失这个定义的变量名(因为压缩,变量名变化了),导致无法读取该变量。
1 | |
去掉console信息
这也是通过terser-webpack-plugin实现的,代码如下:
1 | |
常见问题
如何设置服务启动的端口号?
默认的端口号是8080,是在node_modules/webpack-dev-server/lib/utils/defaultPort.js这个文件里面配置的。
如果我们实际应用中想修改端口号,可以在项目的webpack.config.xx.js中进行调整。比如我们想将开发环境的端口号改为8888,那么就应该在webpack.config.dev.js中做如下设置:
1 | |
如何分文件独立打包?
entry里面设置多个文件,然后output的filename采用内置变量来设置最终打包好的文件名即可:
1 | |
如何给不同环境设置不同的接口地址?
通过在webback.config.xxx.js中,设置常量来标注当前环境:
1 | |
然后程序中根据该常量确定使用哪个接口地址:
1 | |
配置文件能否继承?
可以继承,通过引入配置文件,然后修改其属性的方式来实现。
NODE_ENV的值是怎么确定的?
build的时候,如何不压缩JS代码?
如果你设置mode=production,那么webpack打包时,是默认会调用uglifyjs-webpack-plugin插件压缩代码的。
只需要设置mode=development,build后生成的JS文件就不会被压缩了。
mode=production
不会启动服务,而是生成最终的静态文件。
为什么定义的全局变量,在控制台提示是未定义?
我在js文件中定义了一个全局变量:
1 | |
但是在Chrome控制台输出这个变量,却提示未定义:
1 | |
原因是webpack打包时,会自动给所有js代码加上一个闭包,因此这个全局变量实际上就不是全局变量了:
1 | |
解决方案就是直接将需要暴露的全局变量,手动挂载到window对象下:
1 | |
如何不给打包的文件生成hash码?
加上filenameHashing: false即可:
1 | |