溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue-cli3.0如何使用CDN區(qū)分開發(fā)、生產、預發(fā)布環(huán)境

發(fā)布時間:2020-10-16 17:19:09 來源:腳本之家 閱讀:541 作者:內孤 欄目:web開發(fā)

前言:上一篇記錄文vue-cli 3.0 build包太大導致首屏過長的解決方案中提到了CDN優(yōu)化,之前是直接在html中手動注入JS,也沒有對開發(fā)和生產模式進行區(qū)分,因為是使用收費的CDN,所以在開發(fā)模式會遇到無權使用CDN的問題。要是使用CDN寫死在html中,不同環(huán)境需要手動的切換CDN,那么早晚有一天會搞亂,下面就說說怎么在vue-cli 3.0 中根據不同環(huán)境動態(tài)注入CDN。

1. 修改public/index.html

通過htmlwebpackplugin動態(tài)注入腳本和樣式,index.html如下:

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="icon" href="<%= BASE_URL %>favicon.ico" rel="external nofollow" >
  <title>杭州納舍科技</title>
  <!-- 使用CDN的CSS文件 -->
  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
   <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="external nofollow" rel="external nofollow" rel="preload" as="style">
   <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="external nofollow" rel="external nofollow" rel="stylesheet">
  <% } %>
  <!-- 使用CDN的JS文件 -->
  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
   <link href="<%= htmlWebpackPlugin.options.cdn.js[i] %>" rel="external nofollow" rel="preload" as="script">
  <% } %>
 </head>
 <body>
  <noscript>
   <strong>We're sorry but ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  </noscript>
  <div class="global-loading">
   <div class="spinner"></div>
  </div>
  <div id="app"></div>
  <!-- built files will be auto injected -->
  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
   <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
  <% } %>
 </body>
</html>

2. 修改vue.config.js配置

首先我們會考慮哪些東西要進行CDN優(yōu)化,例如我們需要把vue、vue-router、moment在構建的時候排除在外使用CDN加載這三個庫,那么需要把添加externals

const isProduction = process.env.NODE_ENV === 'production';
module.exports = {
 configureWebpack: config => {
  if (isProduction) {
   config.externals = {
    'vue': 'Vue',
    'vue-router': 'VueRouter',
    'moment': 'moment'
   }
  }
 }
}

現(xiàn)在我們運行npm run build 打包出來的文件就沒有Vue、VueRouter、moment,現(xiàn)在我們使用html-webpack-plugin插件進行動態(tài)注入CDN,在vue-cli 3.0 中我們要這樣配置:

const isProduction = process.env.NODE_ENV === 'production';
const cdn = {
 css: ['xxx.css', 'sss.js'],
 js: ['xxxx.js', 'sss.js']
}
module.exports = {
 configureWebpack: config => {
  if (isProduction) {
   config.externals = {
    'vue': 'Vue',
    'vue-router': 'VueRouter',
    'moment': 'moment'
   }
  }
 }
 chainWebpack: config => {
  if (isProduction) {
   config.plugin('html')
   .tap(args => {
     args[0].cdn = cdn;
    return args;
   })
  }
 }
}

到目前為止已經解決了開發(fā)模式不使用CDN,生產模式使用CDN的問題和動態(tài)在html中注入CDN的問題。

可能你會遇到和我一樣的問題

預發(fā)布build測試,但無權使用生產上的CDN問題,那么我們必須再添加一個環(huán)境變量來區(qū)分預發(fā)布build的模式。(vue-cli 3.0 環(huán)境變量文檔)這里我添加一個IS_LOCAL_BUILD,首先我們在vue.cofnig.js同路徑下創(chuàng)建一個.en.production.local :

// .en.production.local` 內容:
IS_LOCAL_BUILD = 'isLocalBuild'

修改vue.config.js如下:

const isProduction = process.env.NODE_ENV === 'production';
const isLocalBuild = process.env.IS_LOCAL_BUILD === 'isLocalBuild';
const JS_CDN = isLocalBuild ? [
 預發(fā)布CDN(例如那些免費的CDN)
] : [
 生產環(huán)CDN
];
const CSS_CDN = isLocalBuild ? [預發(fā)布CDN]: [生產CDN]
const cdn = {
 css: CSS_CDN,
 js: JS_CDN
}
module.exports = {
 configureWebpack: config => {
  if (isProduction) {
   config.externals = {
    'vue': 'Vue',
    'vue-router': 'VueRouter',
    'moment': 'moment'
   }
  }
 }
 chainWebpack: config => {
  if (isProduction) {
   config.plugin('html')
   .tap(args => {
     args[0].cdn = cdn;
    return args;
   })
  }
 }
}

ok,上面區(qū)分了生產、預發(fā)布和開發(fā)環(huán)境使用CDN的問題,這樣就不用根據不同環(huán)境手動去修改CDN了。不過又一點要注意:⚠️預發(fā)布版本的構建才需要添加.en.production.local。

完整的vue.config.js(供參考)

const path = require('path');
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const productionGzipExtensions = ['js', 'css'];
const isProduction = process.env.NODE_ENV === 'production';

function resolve(dir) {
 return path.join(__dirname, dir);
}

// 預發(fā)布環(huán)境
const isLocalBuild = process.env.IS_LOCAL_BUILD === 'isLocalBuild';
console.log('前端文件預發(fā)布打包- isLocalBuild:', isLocalBuild);

// 非externals CND前綴設置
const CDN_URL = isLocalBuild ? '/' : '//s.zypj.nasetech.com/';

// 區(qū)分生產環(huán)境打包和預發(fā)布打包,使用不同的CDN
const JS_CDN = isLocalBuild ? [
 // 預發(fā)布CDN
] : [
 // 生產CDN
];

const cdn = {
 // css: [],
 js: JS_CDN
}

module.exports = {
 lintOnSave: true,
 baseUrl: isProduction ? CDN_URL : '/',
 chainWebpack: (config) => {
  // build打包才使用CDN
  if (isProduction) {
   config.plugin('html')
   .tap(args => {
     args[0].cdn = cdn;
    return args;
   })
  }

  config.resolve.alias
   .set('assets', resolve('src/assets'))
   .set('pages', resolve('src/pages'))
   .set('components', resolve('src/components'))
   .set('utils', resolve('src/utils'))
 },
 devServer: {
  host: '0.0.0.0',
  port: 8080,
  https: false,
  hotOnly: false,
  disableHostCheck: false,
  proxy: {
   '/api/v0/': {
    // 目標 API 地址
    target: 'http://127.0.0.1:4545',
    // 將主機標頭的原點更改為目標URL
    changeOrigin: true,
   },
  },
 },
 configureWebpack: config => {
  // 生產模式
  if (isProduction) {
   config.externals = {
    'vue': 'Vue',
    'vue-router': 'VueRouter',
    'moment': 'moment'
   }
   // 打包生產.gz包
   config.plugins.push(new CompressionWebpackPlugin({
    algorithm: 'gzip',
    test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
    threshold: 10240,
    minRatio: 0.8
   }))
   // 添加自定義代碼壓縮配置
   config.plugins.push(
    new UglifyJsPlugin({
     uglifyOptions: {
      compress: {
       warnings: false,
       drop_debugger: true,
       drop_console: true,
      },
     },
     sourceMap: false,
     parallel: true,
    })
   )
  }
 }
}

* 使用CDN一些有意思的坑:

使用CDN還會遇到一些有意思的事,例如使用beta版的vue導致element UI庫有些組件無法正常工作; 使用免費的CDN上線沒有多久就GG不能用等悲慘故事?。。?/p>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI