进击webpack 4 (基础篇一)
进击webpack4 (基础篇二:配置 一)
进击webpack4 (基础篇三:配置 二)

不解析不依赖第三方模块的模块

noParse

有一些第三方模块,它本身不依赖于其他模块,比如jquery,lodash,不去编译这些库,会使得webpack打包更加快速
noParse是个正则或者包含正则的数组 RegExp | [RegExp]

module:{noParse:/jquery/, //不去解析jqueryrules:[//...]},
---------------------

忽略某些库内的第三方模块

ignorePlugin

以moment这个时间库为例, 导入moment的同时, moment会引入自身依赖的语言包,这些语言包其中有部分是我们不需要用到的,moment内部代码

  plugins: [new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)],

2个参数代表的意思是:

当匹配到moment这个库的时候 引入moment并且忽略moment里面匹配到locale的库

这个时候我们如果想要自己需要的locale 需在main.js手动引入

import 'moment/locale/zh-cn'

动态链接库

另起一个webpack.config.dll.js 专门用来生成动态链接库

//webpack.config.dll.jsconst path=require('path');
const webpack=require('webpack');
module.exports={mode:'development',entry: {react:['react','react-dom'],jquery:['jquery']},// 把 React 相关模块的放到一个单独的动态链接库output: {path: path.resolve(__dirname,'dist'),// 输出的文件都放到 dist 目录下filename: '[name].dll.js',//输出的动态链接库的文件名称,[name] 代表当前动态链接库的名称library: '_dll_[name]',//存放动态链接库的全局变量名称,例如对应 react 来说就是 _dll_react},plugins: [new webpack.DllPlugin({// 动态链接库的全局变量名称,需要和 output.library 中保持一致// 该字段的值也就是输出的 mainfest.json 文件 中 name 字段的值// 例如 react.manifest.json 中就有 "name": "_dll_react"name: '_dll_[name]',// 描述动态链接库的 manifest.json 文件输出时的文件名称path: path.join(__dirname, 'dist', '[name].mainfest.json')})]
}
//打包
npx webpack --config webpack.config.dll.js 

这样会在dist生成

然后在webpack.config.js里

const webpack= require('webpack')
plugins: [new webpack.DllReferencePlugin({manifest:require('./dist/react.mainfest.json')}),new webpack.DllReferencePlugin({manifest:require('./dist/jquery.mainfest.json')})
]

这里它会从mainfest.json寻找name 然后根据它的标识找到相应内容, dll.js就是打包出来后的动态链接库

然后在html模板文件里引入

<script src="./jquery.dll.js"></script>
<script src="./react.dll.js"></script>

如果你在main.jsimport React from 'react',他会首先找动态链接库, 找不到才会执行打包


注:使用react需要配置好rule


{
test:/\.js/,use:{loader:'babel-loader',options:{presets:['@babel/preset-env','@babel/preset-react']}}
},

开启多进程打包

npm i happypack -D

如果一个项目代码密集,读写操作频繁,happypack 就能让Webpack把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。

const HappyPack = require('happypack');rules: [{test: /\.js$/,// 把对 .js 文件的处理转交给 id 为 babel 的 HappyPack 实例use: ['happypack/loader?id=babel'],exclude: path.resolve(__dirname, 'node_modules'),},{test: /\.css$/,// 把对 .css 文件的处理转交给 id 为 css 的 HappyPack 实例use: ['happypack/loader?id=css']}
]
new Happypack({//ID是标识符的意思,ID用来代理当前的happypack是用来处理一类特定的文件的id: 'js',use: [{loader: 'babel-loader',//options=query都是向插件传递参数的options: {presets: [["@babel/preset-env", { modules: false }], "@babel/preset-react"],plugins: [["@babel/plugin-proposal-decorators", { "legacy": true }],["@babel/plugin-proposal-class-properties", { "loose": true }],]}}]}),new Happypack({//ID是标识符的意思,ID用来代理当前的happypack是用来处理一类特定的文件的id: 'css',use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader'],threads: 4,//你要开启多少个子进程去处理这一类型的文件verbose: true//是否要输出详细的日志 verbose})

注意:开启进程也需要时间, 如果一个项目并不是很复杂, 斟酌使用

不打包第三方库 使用cdn引入

module.exports = {//...externals: {jquery: 'jQuery'}
};

main.js 引入jquery 将不会打包 import jquery from 'jQuery'

html模板内引入jquery的cdn地址即可

尽量使用es6的模块导入

webpack的tree-shaking自己可以分析出哪些没有使用到的代码可以剔除,前提是es6模块语法
scope-hosting可以提升作用域 比如 var a = 1; var b = a ; console.log(b) 会编译成var b = 1; console.log(b)

提取公共代码

做这种操作首先得是多页面

 entry:{home:['./src/index.js'],login:['./src/login.js']
}, // 入口文件
//home.js
import React from 'react'
import {render }from 'react-dom'
render(<h1>动态链接库</h1>,window.root)//login.js
import React from 'react'
import {render }from 'react-dom'
render(<h1>动态链接库</h1>,window.root)
//webpack.config.jsoptimization:{  // 优化splitChunks:{ //分割代码cacheGroups:{ // 缓存组common:{ // 公共的代码  一般是自己写的公共代码chunks:'initial',minSize:0,   minChunks: 2, //最少被引用2次的模块name: "common"},vendor:{  // 一般是第三方公共模块priority:1, // 因为执行是从上往下, 所以设置优先级比上面高  不然上面抽离的话第三方模块也被抽离了   test:/node_modules/ , //匹配node_modules下的公共代码,chunks:'initial',minSize:0,   minChunks: 2, //最少被引用2次的模块name: "vendor"}    }}
}

懒加载

这里拿vue举例

const Login = () => import(/* webpackChunkName: "login" */,"./login");
new VueRouter({routes: [{ path: "/login", component: Login }]
})

webpackChunkName虽然是注释, 但是webpack能识别, 编译后这个组件生产的名字就是login

可能会需要@babel/plugin-syntax-dynamic-import 才能识别

yarn add @babel/plugin-syntax-dynamic-import -D

具体配置看此文

热更新

devServer:{// 告诉 DevServer 要开启模块热替换模式hot: true,
}  

在vue中只要这样配置就可以了, vue自己帮我们做了配置

其他库中:

import React from 'react'
import {render} from 'react-dom'render(<App/>, document.getElementById('root'));if (module.hot) {// accept 函数的第一个参数指出当前文件接受哪些子模块的替换,这里表示只接受 ./AppComponent 这个子模块// 第2个参数用于在新的子模块加载完毕后需要执行的逻辑module.hot.accept(['./App'], () => {// 新的 AppComponent 加载成功后重新执行下组建渲染逻辑let App=require('./App').default;  render(<App/>, document.getElementById('root'));});
}

进击webpack4 (优化篇)相关推荐

  1. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

  2. 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  3. C语言嵌入式系统编程修炼之道——性能优化篇

    C语言嵌入式系统编程修炼之道--性能优化篇 作者:宋宝华  e-mail:[email]21cnbao@21cn.com[/email] 1.使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌 ...

  4. struts启动时加载_iOS优化篇之App启动时间优化

    原文:橘子不酸丶http://www.zyiner.com/article/5 前言 最近由于体验感觉我们的app启动时间过长,因此做了APP的启动优化.本次优化主要从三个方面来做了启动时间的优化,m ...

  5. mysql性能调优快捷键_mysql优化篇

    mysql优化篇 2019-4-12 hubo 数据库 优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作 ...

  6. android 优化启动事件,张绍文android开发高手课读书笔记4-启动优化篇

    启动优化篇 在说如何对启动时间进行优化之前,我们得先知道从用户点击应用图标开始,一共经历了那些阶段. 主要阶段如下图. image T0-T1阶段 这个阶段是手机系统解析点击事件,效应快慢跟手机性能有 ...

  7. 老司机谈APK瘦身套路-项目优化篇

    老司机谈APK瘦身套路-项目优化篇 在上一篇文章中,老司机带领大家一起学习了图片资源的瘦身套路,收到了很多中学生读者的好评. 想了解的童鞋请点击:blog.csdn.net/mynameishua-  ...

  8. 移动spa商城优化记(一)---首屏优化篇

    背景 随着公司业务的不断壮大,最近老是有用户反应公司APP内的商城打开比较慢,这可不行啊,慢了容易流失用户,流失用户减少公司业绩,公司业绩少我的年终奖就少----,所以为了公司,也为了自己,开始优化之 ...

  9. 分布式队列编程优化篇

    "分布式队列编程"是一个系列文,之前我们已经发布了<分布式队列编程模型.实战>,主要剖析了分布式队列编程模型的需求来源.定义.结构以及其变化多样性:根据作者在新美大实际 ...

最新文章

  1. linux ubuntu R 无法安装rggobi包的原因及解决方案
  2. python数据接口获取数据_python UI自动化实战记录二:请求接口数据并提取数据
  3. Shiro和SpringBoot简单集成
  4. CDQ分治 Jam's problem again [HDU - 5618]
  5. 专题开发十二:JEECG微云快速开发平台-基础用户权限
  6. CentOS6.6下搭建vsftpd+PAM认证
  7. 在某个文件夹中打开 cmd黑窗口
  8. 101/103/104规约应用典型问题例举
  9. 第十章 DirectX 绘制简单场景,地形,天空盒和跟随摄像机(上)
  10. 微型计算机及接口技术笔记,2010年自考微型计算机及其接口技术笔记串讲
  11. JavaWeb过滤器分类
  12. iOS 9 Spotlight搜索 OC版
  13. HbuilderX表格练习2
  14. uniapp 生成商品海报并分享保存
  15. 利用Python实现word文档合并
  16. sublime使用教程及快捷方式
  17. 帝国cms 修改系统自带语言模板文件
  18. 分享本周所学——人工智能语音识别模型CTC、RNN-T、LAS详解
  19. 听见丨特斯拉电动卡车售价公布:100万元起 朱啸虎:ofo和摩拜会合并 但还要再经历一战
  20. 自建对象存储 minio 搭建和使用

热门文章

  1. docker镜像、容器管理
  2. LNMP - Nginx访问控制
  3. shell截取字符串方法
  4. Java程序员从笨鸟到菜鸟之(五十二)细谈Hibernate(三)Hibernate常用API详解及源码分析--csdn 曹胜欢...
  5. 《剑指offer》-逐层打印二叉树
  6. Android 关于获取摄像头帧数据解码
  7. XenMobile 8.7对iOS7.1 企业级MDM管理功能带来哪些扩展?
  8. Outlook启动提示“找不到文件Outlook.pst文件”
  9. 《数据结构》学习笔记一:绪论
  10. java内部类和静态内部类的区别