国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue-cli3.0如何使用CDN區分開發、生產、預發布環境

2019-11-19 12:29:18
字體:
來源:轉載
供稿:網友

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

1. 修改public/index.html

通過htmlwebpackplugin動態注入腳本和樣式,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優化,例如我們需要把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'   }  } }}

現在我們運行npm run build 打包出來的文件就沒有Vue、VueRouter、moment,現在我們使用html-webpack-plugin插件進行動態注入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;   })  } }}

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

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

預發布build測試,但無權使用生產上的CDN問題,那么我們必須再添加一個環境變量來區分預發布build的模式。(vue-cli 3.0 環境變量文檔)這里我添加一個IS_LOCAL_BUILD,首先我們在vue.cofnig.js同路徑下創建一個.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 ? [ 預發布CDN(例如那些免費的CDN)] : [ 生產環CDN];const CSS_CDN = isLocalBuild ? [預發布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,上面區分了生產、預發布和開發環境使用CDN的問題,這樣就不用根據不同環境手動去修改CDN了。不過又一點要注意:⚠️預發布版本的構建才需要添加.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);}// 預發布環境const isLocalBuild = process.env.IS_LOCAL_BUILD === 'isLocalBuild';console.log('前端文件預發布打包- isLocalBuild:', isLocalBuild);// 非externals CND前綴設置const CDN_URL = isLocalBuild ? '/' : '//s.zypj.nasetech.com/';// 區分生產環境打包和預發布打包,使用不同的CDNconst JS_CDN = isLocalBuild ? [ // 預發布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不能用等悲慘故事!!!

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沿河| 农安县| 梧州市| 崇文区| 郁南县| 光泽县| 外汇| 和龙市| 济宁市| 利辛县| 商水县| 金昌市| 罗甸县| 黄龙县| 灵武市| 江达县| 云南省| 苍南县| 宝清县| 财经| 文昌市| 云安县| 锦屏县| 高密市| 荥阳市| 康马县| 南岸区| 双峰县| 古丈县| 辽宁省| 奎屯市| 台江县| 腾冲县| 儋州市| 永春县| 枝江市| 岚皋县| 蓬莱市| 合作市| 南陵县| 平原县|