tree shaking: 去除无用代码
前提:1.必须使用ES6模块化 2.开始production环境
做用:减小代码体积css
在package.json中配置
"sideEffects": false 全部代码都没有反作用(均可以进行tree shaking)
问题: 可能会把css / @babel/polyfill (反作用)文件干掉
"sideEffects": [".css", ".less"]node
// 单入口 // entry: './src/js/index.js' entry: './src/js/index.js', // 多入口:有一个入口,最终输出就有一个bundle /** entry: { main: './src/js/index.js', test: './src/js/test.js' }, */ output: { // [name]: 取文件名 filename: 'js/[name].[contenthash:10].js', path: resolve(__dirname, 'build') },
/** * 1. 能够将node_modules中代码单独打包一个chunk,最终输出 * 自动分析多入口chunk中,有没有公共的文件。若是有,会打包成单独一个chunk */ optimization: { splitChunks: { chunks: 'all' } },
export function mul(x,y){ return x * y; }
import { mul } from './print.js'; /** * 经过js代码,让某个文件被单独打包成一个chunk * import动态导入语法:能将某个文件单独打包 */ import (/* webpackChunkName: 'test' */'./print.js') .then(({mul, count}) => { // 文件加载成功~ // eslint-disable-next-line console.log(mul(3,4)); }) .catch(() => { // eslint-disable-next-line console.log('文件加载失败~~'); })
/** * 懒加载:当文件须要使用时才加载 * 预加载prefetch:会在使用以前,提早加载js文件 * 正常加载能够认为是并行加载(同一时间加载多个文件) * 预加载prefetch:等其余资源加载完毕,浏览器空闲了,再偷偷加载资源 */ import (/* webpackChunkName: 'test', webpackPrefetch: true */'./print.js') .then(({mul, count}) => { // 文件加载成功~ // eslint-disable-next-line console.log(mul(3,4)); }) .catch(() => { // eslint-disable-next-line console.log('文件加载失败~~'); })
PWA: 渐进式网络开发应用程序(离线可访问)webpack
/** * PWA: 渐进式网络开发应用程序(离线可访问) * workbox --> workbox-webpack-plugin */ const WorkboxWebpackPlugin = require('workbox-webpack-plugin')
在plugins中配置以下:web
new WorkboxWebpackPlugin.GenerateSW({ /** * 1. 帮助serviceWorker快速启动 * 2. 删除旧的serviceWorker * * 生成一个serviceWorker配置文件~~ */ clientsClaim: true, skipWaiting: true })
/** * 1. eslint不认识window、navigator全局变量 * 解决: 须要修改package.json中eslintConfig配置 "eslintConfig": { "extends": "airbnb-base", "env": { "browser": true } } 2. serviceWorker代码必须运行在服务器上 --> nodejs --> npm i serve -g serve -s build 启动服务器,将build目录下全部资源做为静态资源暴露出去 */ // 注册serviceWorker // 处理兼容性问题 if ('serviceWorker' in navigator){ window.addEventListener('load', () => { navigator.serviceWorker .register('/service-worker.js') .then(() => { console.log('serviceWorker注册成功了!!!'); }) .catch(() => { console.log('serviceWorker注册失败 了!!!'); }) }) };
注意:若是引用了eslint,须要在package.json的eslintConfig中配置,由于eslint不认识window、navigator全局变量,配置以下:npm
"eslintConfig": { "extends": "airbnb-base", "env": { "browser": true } }