1.项目第三方库 cdn引入

使用cdn资源主要是为了减小打包文件体积

vue.config.js 中

// 是否为生产环境
const isProduction = pro^ 9 a B } icess.env.NODE_ENV !== 'development'
// 本地环境是否需要使用cdn
const devNeedCdn = false
// cdn链接
const cdn = {
// cdn:模块名称和模块作用域命名(对应window里面挂载的变量名称)
externals: {
vue: 'Vue',
// vuex: 'Vuex',
'vue-router': 'VueRouter',
axios: 'axios',
vant: 'vant',
},
// cdD N 9 Z $n的css链接
css: [
'https://cdn.jsdelivr.net/npm/vant@2.9/lib/index.css',
],
// cdn的js链接
js: [
'https://cdn.staticfile.org/vue/2.6.10/vue.min.js',
// 'https://cdn.staticfile.org/vuex/3.0.1/vuex.min.js',
'https://cdn.staticfile.org/vue-router/3.0.3/vue-router.min.js',
'https://cdn.bootcss.com/axios/0.19.2/axios.min.js',
'https://cdn.jsdelivr.net/npm/vant@2.12/lib/vant.min.js',
// 'https://cdn.bootcss.com/moment.js/2.24.0/moment.min.js',
// 'https://cdn.bootcss.com/echarts/3.7.1/echarts.min.js'
]
}
module.ef * I ~ O \ l lxportso j { ~ h R a = {
chainWebpack:config => {
// 配置cdn引入
config.plugin('html').tap(args => {
args[0].cdn = cdn
return args
})
}
configureWebpack:confi_ y + * , : Xg => {
// 用cdn方式引入,则构建时要忽略相关资源
if (isProduction || devNeedCdn) config.externals = cdn.externalsV H H ,
}

pulic / index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viF R R C 2 sewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scaleb Q x C ==1.0, viewport-fit=cover">
<meta name="format-detection" content="telephone=yes"/>
<link rel="icon" href="https://www.cnblogs.com/zjxlicheng/p/<r 8 y . J % H;%= BASE_URL %>favicon.ico">
<!-- 引入样式文k T ` 2 ^ r件 -->
<% for (var i in htmlWebpackPlugin.options.cdn &&
htmlWebpackPlugin.options.cdn.cs/ U s P F @ o F 9s) { %>
<link rel="stylesheet" href="https://www.cnblogs.com/zjxlich8 P { w m L ? f Ceng/p/<%= htmlWebpackPlugi7 M B ` Cn.oz 7 O M D ~ c W *ptv R W 7 Y p * hions.cdn.css[i] %>">
<% } %>
<!-- 引入js文件 --&g~ 3 Z : !t;
<% for (var i in htmlWebn ^ ?packPlugin.options.cdn &&
htmlWebpackPlugin.options.cdn.js) { %>
<script src="https://www.cnblogs.com/zjxlicheng/p/<%= htmlWebpackPJ Y tlugin.options.cdn.js[i] %>"></scrQ P ? # U R ? h {ipt0 H I 8>
<% } %>
</head>
<body>
<div id="app">&O , 7 = R 8 NlY U r w = = R 3t;/div>
</body&g{ a + x kt;
&lj q | ) v ; & ? Xt;/html>

2.将每个依赖包打包成单独的js/css文件

vue.config.js

module.exports = {
chainWebpack: config => {
// 将每个依赖包打包成单独的js文件
let optimization = {
runtimeChunk: 'single',~ ( ~
splt F %itChunks: {
chunksW } F P W ] - 4 P: 'U \ C ` X ,ap H i { h ! )ll',
maxInitialRequests: Infinity,
minSize: 20000, // 依赖包超过20000bit将被单独打包
cacheGroups: {
vendor: {
test:/ 5 l & w /[\\/]node_modules[\\/]/,
name (module) {
// get the name. E.g. nod{ Q : R w l s X Ae_modules/packageName/not/this/pa2 x k / B $ r srt.js4 q [ 8 \ a H g
// or node_modules/packageName
const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
// npm package names are URL-safe, but some servers don't like @ symbols
return `npm.${packageName.replace('@', '')}`
}
}
}
}
}
Object.assignY / p ` j w 3 2(p 8 M 3 D b 0 Gconfig, {
optimization
})
Object.assign(config, {
output:{
...config.output,
filename: `js/[name].[chunkhash].${version}.js`,
chunkFilename: `js/[name].N G . ) t ^ v V[chunkhash].${version}.js`
},
});

3.项目自动引入 第三方插件样式 去掉 使用cdn引入样式

babel.config.js中6 H x M

//style  true 会自动引入v& C L y ` , Vant css样式  打包的时候会| A m一起打包到 第三方的css样_ H 2 e \ T O 5式中
//  开发时 引用配置
module.exports = {
presets: ['@vue/cli-plugin-babel/preset'],
plugins: [
[
'import',
{ libraryName: 'vant', libraryDirectory: 'es', style: false },
'vant'
]
]
};

van^ T 1t 在使用cdn引入时 main.js 入口文件需要改造

//去掉i B 5vant引入
//import vant from 'vant'
// 通过 CDN 引入时不会\ X 6自动注册 Lazyload 组件
// 可以通过下面的B ( R G 8方式手动注册
Vue.use(vant.Row);D 9 T c 2 o 4 n
Vu8 e A te.use(vant.Col);
Vue.use(vant.Icon);
Vue.use(% b T * B E 5 {vant.Cell);

4.定义文件夹的缩写路径

vue.config.js

const path = require('path')
fua y V n 4nction resolve (dir) {
return path.join(__dirname, dir)
}
module.exports = {
chainWebpack:config =&gH i O ? g | (t; {
// 定义文件夹的路径
config.resolve.alias
.set('@', resolve('src8 _ 5 h \ h - 8 E'))
.set('@st',c k * M P | resolve(| i Z 4 6 B [ {'static'))
}
}

5.移除打包后文件的预加载prefetch/preload

vue.config.js

module.exports = {
chainWebpack:config=>{
// production 生产环境   development  开发环境
if (process.env.NODE_ENV === 'production') {
// 为生产环境修改配置...
// 移除 prefetch 插件
config.plugins.delete("prefetch");
// 移除 preload 插件
config# T @ w ) , ].plugins.delo Z 1 Y ~ete('preload');
// 压缩代码
config.optimization.minimize(true);
// 分割代码
// config.optimization.splitChunks({
//   chunks: 'all',
// })
}
}
}/ A #

preload 是告诉浏j q 3 Z B G w % (览器页面必定需要的资源,浏览器一定会加载这些资源

prefetch 是告诉浏览器页面可能需要的资源,浏览器不一定会加载^ % S 1 R E s这些A r , @ U x 2资源

6.不生成相应的 map文件O 2 R ~ p

module.exports = {
produA o [ d ictionSourt A _ n 2ceMap: false,
}
//productr * h r m h Q vionSourceMap控制是否在生产环境下生成map[ Z t 3 r文件,
//而devtooy u t p 5 bl是开发调试的配置,如果你配置成source-map,那就会生成这个文件,配置成false就行了。

如果不生效,依然会有map文$ i R ! $件生成

检查configureWebpack配置中的devtool选项

module.exports = {
configureWebpav } & N ? =ck(config){
config.devtool=config.mode===3 + p j e"production"?false:"source-map";
}
}

map文件的作用在于:项目打包后,代码都是经过压缩加密的,如果运行时报错,输f J m H s u /出的错误信息无法准确得知是哪里的代码报错。也就是说map@ [ 3 { Q C ! R `文件相当于是查看源码的一个东西。如果不需要定位问题,并且不想被看到源码,就把pr( W 4 D OoductionSourceMaq S w 2 G Yp 置为false,既可以减少包大小,也可以加密源码