webpack4系列教程,如何抽取公共js和css?
发布于 作者:苏南大叔 来源:程序如此灵动~

当大家开始构建webpack
工程后,就会慢慢发现:如果有多个入口文件的话,一些公共的类库会在多个入口文件中出现。比如jquery.js
,多次出现的这种情况是不科学的。为了解决这种弊端,webpack
引入了个splitChunks
的概念,可以提取一些公共模块到单独的文件,以便于做服务器端缓存。

本文测试环境:win10
、node@14.2.0
、npm@6.14.4
、webpack@4.43.0
、jquery@3.5.1
。
过时的插件
当然,目前在网上百度这个问题的时候,大多数网页给出的答案还是CommonsChunkPlugin
,但是CommonsChunkPlugin
已经是过去时了。在webpack@4
中使用的时候,会有如下提示:

修改优化选项
目前解决本文的问题的话,需要使用webpack@4
自带的splitChunks
功能。修改webpack.config.js
如下:
一般来说,定义一组即可,例如上例中的common
。当然,如果您愿意,还可以定义第二组可被抽离的vendor
。两者之间,使用name
进行区别,规则使用test
进行区别,优先级使用priority
进行区别。

- 比如
jquery.js
,这个本身属于common
的概念,但是同时它也属于vendor
,那么这个时候,就看那条规则的priority
数值大了,数值大的规则优先级高。 - 而开发人员自己编写的库文件,一般都不会是属于
vendor
的。所以,一般来说是会落入common
的范畴。 - 如果有两条及以上规则的话,请注意:
test
和priority
。 minChunks
指的是在.js
文件中require
或者import
的次数。- 经过苏南大叔实验,最佳迷你组合是:
name
、chunks
、minSize
、minChunks
。
特别提示
特别需要注意的是:css
的公共部分的概念,也是体现在.js
里面的import
,而不是css
文件里面的@import url("")
。例如:
两个入口文件,分别引入css
文件:
而test.scss
和test.less
中,又分别有:
那么,在本文中,被抽取的是test.css
,而不是iconfont.css
。
这里的结论就是:这个抽取公共css
的逻辑是很不智能的,只能抽取在js
中的import
,而不能识别在css
中的@import url()
。

另外,需要说明的是:这种自动提取的js
和css
,会自动插入到HtmlWebpackPlugin
的对应.html
文件中,无需做过多干涉。它们的名字和路径遵从:
css
=>MiniCssExtractPlugin.filename
和name
。js
=>output.filename
和name
。


相关链接
- https://newsn.net/say/webpack-start.html
- https://newsn.net/say/webpack-jquery.html
- https://newsn.net/say/webpack-expose-loader.html
- https://newsn.net/say/webpack-provide-plugin.html
- https://newsn.net/say/webpack-css.html
总结
本文中,苏南大叔描述的是:如何配置webpack
,以达到抽取公共代码(.js
和.css
)的目的。更多webpack
相关教程文章,可以参考苏南大叔的文章:


