使用cdn資源主要是爲了減少打包文件體積css
vue.config.js 中html
// 是否爲生產環境 const isProduction = process.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', }, // cdn的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.exports = { chainWebpack:config => { // 配置cdn引入 config.plugin('html').tap(args => { args[0].cdn = cdn return args }) } configureWebpack:config => { // 用cdn方式引入,則構建時要忽略相關資源 if (isProduction || devNeedCdn) config.externals = cdn.externals }
pulic / index.htmlvue
favicon.ico"/> "/> " cdata_tag="script" _ue_custom_node_="true">
vue.config.jsnode
module.exports = { chainWebpack: config => { // 將每一個依賴包打包成單獨的js文件 let optimization = { runtimeChunk: 'single', splitChunks: { chunks: 'all', maxInitialRequests: Infinity, minSize: 20000, // 依賴包超過20000bit將被單獨打包 cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name (module) { // get the name. E.g. node_modules/packageName/not/this/part.js // 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.assign(config, { optimization }) Object.assign(config, { output:{ ...config.output, filename: `js/[name].[chunkhash].${version}.js`, chunkFilename: `js/[name].[chunkhash].${version}.js` }, });
babel.config.js中ios
//style true 會自動引入vant css樣式 打包的時候會一塊兒打包到 第三方的css樣式中 // 開發時 引用配置 module.exports = { presets: ['@vue/cli-plugin-babel/preset'], plugins: [ [ 'import', { libraryName: 'vant', libraryDirectory: 'es', style: false }, 'vant' ] ] };
vant 在使用cdn引入時 main.js 入口文件須要改造vue-router
//去掉vant引入 //import vant from 'vant' // 經過 CDN 引入時不會自動註冊 Lazyload 組件 // 能夠經過下面的方式手動註冊 Vue.use(vant.Row); Vue.use(vant.Col); Vue.use(vant.Icon); Vue.use(vant.Cell);
vue.config.jsvuex
const path = require('path') function resolve (dir) { return path.join(__dirname, dir) } module.exports = { chainWebpack:config => { // 定義文件夾的路徑 config.resolve.alias .set('@', resolve('src')) .set('@st', resolve('static')) } }
vue.config.jsnpm
module.exports = { chainWebpack:config=>{ // production 生產環境 development 開發環境 if (process.env.NODE_ENV === 'production') { // 爲生產環境修改配置... // 移除 prefetch 插件 config.plugins.delete("prefetch"); // 移除 preload 插件 config.plugins.delete('preload'); // 壓縮代碼 config.optimization.minimize(true); // 分割代碼 // config.optimization.splitChunks({ // chunks: 'all', // }) } } }
preload 是告訴瀏覽器頁面一定須要的資源,瀏覽器必定會加載這些資源axios
prefetch 是告訴瀏覽器頁面可能須要的資源,瀏覽器不必定會加載這些資源瀏覽器
module.exports = { productionSourceMap: false, } //productionSourceMap控制是否在生產環境下生成map文件, //而devtool是開發調試的配置,若是你配置成source-map,那就會生成這個文件,配置成false就好了。
若是不生效,依然會有map文件生成
檢查configureWebpack配置中的devtool選項
module.exports = { configureWebpack(config){ config.devtool=config.mode==="production"?false:"source-map"; } }
map文件的做用在於:項目打包後,代碼都是通過壓縮加密的,若是運行時報錯,輸出的錯誤信息沒法準確得知是哪裏的代碼報錯。也就是說map文件至關因而查看源碼的一個東西。若是不須要定位問題,而且不想被看到源碼,就把productionSourceMap 置爲false,既能夠減小包大小,也能夠加密源碼