webpack+react+antd脚手架优化的方法


Posted in Javascript onApril 02, 2018

在之前的文章中了解了webpack v4的特性,现在将知识用于实践,对之前写的一个react脚手架进行打包性能的优化。

优化类目

  1. 样式分离
  2. 第三方资源分离
  3. 区分开发环境
  4. 热更新
  5. 提取公共代码

1. CSS分离

npm install extract-text-webpack-plugin -D

webpack.config.js

将css、less、sass文件单独从打包文件中分离

+ let cssExtract = new ExtractTextWebpackPlugin({
+ filename: 'css.css',
+ allChunks: true
+ });
+ let sassExtract = new ExtractTextWebpackPlugin('sass.css')
+ let lessExtract = new ExtractTextWebpackPlugin('less.css')

在webpack.config.js中单独添加规则,

  1. test:匹配处理文件的扩展名的正则表达式
  2. include/exclude手动指定必须处理的文件夹或屏蔽不需要处理的文件夹
{
 test: /\.css$/,
 use: cssExtract.extract({
 fallback: "style-loader",
 use: ['css-loader?minimize','postcss-loader'],
 publicPath: "/dist"
 }),
 include:path.join(__dirname,'./src'),
 exclude:/node_modules/
},
{
 test: /\.scss$/,
 use: sassExtract.extract({
 fallback: "style-loader",
 use: ["css-loader?minimize","sass-loader"],
 publicPath: "/dist"
 }),
 include:path.join(__dirname,'./src'),
 exclude:/node_modules/
},
{
 test: /\.less$/,
 loader: lessExtract.extract({
 use: ["css-loader?minimize", "less-loader"]
 }),
 include:path.join(__dirname,'./src'),
 exclude:/node_modules/
},

然后运行webpack命令时报错

compilation.mainTemplate.applyPluginsWaterfall is not a function

Use Chunks.groupsIterable and filter by instanceof Entrypoint instead

研究得出结论:webpack升级到v4然而响应的插件没有升级的原故。

解决方法:安装指定版本的依赖

"html-webpack-plugin": "^3.0.4"
"extract-text-webpack-plugin": "^4.0.0-beta.0"

resolve

指定extension之后可以不用在require或是import的时候加文件扩展名,会依次尝试添加扩展名进行匹配

resolve: {
 //引入模块的时候,可以不用扩展名
 extensions: [".js", ".less", ".json"],
 alias: {//别名
 "bootstrap": "bootstrap/dist/css/bootstrap.css"
 }
}

监听文件修改

webpack模式下使用,webpack-dev-server模式不用,可以将watch改为false

watchOptions: {
 ignored: /node_modules/,
 aggregateTimeout: 300, //监听到变化发生后等300ms再去执行动作,防止文件更新太快导致编译频率太高
 poll: 1000 //通过不停的询问文件是否改变来判断文件是否发生变化,默认每秒询问1000次
}

提取公共代码

optimization: {
 splitChunks: {
 cacheGroups: {
 commons: {
  chunks: "initial",
  minChunks: 2,
  maxInitialRequests: 5, // The default limit is too small to showcase the effect
  minSize: 0 // This is example is too small to create commons chunks
 },
 vendor: {
  test: /node_modules/,
  chunks: "initial",
  name: "vendor",
  priority: 10,
  enforce: true
 }
 }
 }
 }

分离react react-dom ant公共代码

方法一:externals

在页面上引入第三方资源库,然后使用externals防止将某些 import 的包(package)打包到 bundle 中,而是在运行时(runtime)再去从外部获取这些扩展依赖(external dependencies)。

<script src="https://cdn.bootcss.com/react/16.4.0-alpha.0911da3/cjs/react.production.min.js"></script>
<script src="https://cdn.bootcss.com/react-dom/16.4.0-alpha.0911da3/cjs/react-dom-server.browser.production.min.js"></script>
externals: { 'react': 'React', 'react-dom': 'ReactDOM', // 提出ant design的公共资源, }

方法二:DLL

webpack+react+antd脚手架优化的方法

优化后手架地址

webpack+react+antd脚手架优化的方法

打包速度优化,打包文件细化,改造成功~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Extjs学习笔记之一 初识Extjs之MessageBox
Jan 07 Javascript
jQuery老黄历完整实现方法
Jan 16 Javascript
jQuery选择器源码解读(七):elementMatcher函数
Mar 31 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
Aug 18 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
Sep 14 Javascript
JS产生随机数的用法小结
Dec 10 Javascript
webpack入门必知必会
Jan 16 Javascript
p5.js临摹动态图形实现方法详解
Oct 23 Javascript
Javascript ParentNode和ChildNode接口原理解析
Mar 16 Javascript
原生JS封装拖动验证滑块的实现代码示例
Jun 01 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
Oct 18 Javascript
JS数组方法some、every和find的使用详情
Oct 05 Javascript
vue axios请求超时的正确处理方法
Apr 02 #Javascript
JavaScript 日期时间选择器一些小结
Apr 02 #Javascript
vue计算属性及使用详解
Apr 02 #Javascript
vue小白入门教程
Apr 02 #Javascript
Angular父组件调用子组件的方法
Apr 02 #Javascript
微信小程序wx:for和wx:for-item的用法详解
Apr 01 #Javascript
微信小程序block的使用教程
Apr 01 #Javascript
You might like
js计数器代码
2006/11/04 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
JQuery 操作/获取table具体代码
2013/06/13 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
scrollWidth,clientWidth,offsetWidth的区别
2015/01/13 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
jquery实现下载图片功能
2019/07/18 jQuery
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
项目资料员岗位职责
2013/12/10 职场文书
四年级下册教学反思
2014/02/01 职场文书
幼儿园开学寄语
2014/04/03 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
村长党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
工作经历证明范本
2015/06/15 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
导游词之井冈山
2019/11/20 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
DE1107机评
2022/04/05 无线电