vue-cli2+webpack構建的vue項目如何讓圖片和js等靜態資源走cdn,哪里可以配置呢?下面我詳細介紹
1.config/index.js中可以看到
module.exports = { dev: {...}, build: { assetsSubDirectory: 'static', assetsPublicPath: '/', }
dev相對於本地開發調試用的,build對於發布環境
其中assetsPublicPath就是配置靜態資源的cdn,我們可以再這里配置我們對應的cdn路徑,比如:
assetsPublicPath: 'https://baidu.com/',
2.當然如果只有一個環境,我們只需要assetsPublicPath里面寫死就行,但是我們往往有多個環境,比如測試、預發布、開發等等,那如何配置呢?
首先我們區分當前運行的是那個環境,node。js命令是可以帶參數的,所以我們只要再編譯的命令帶上環境的參數就可以了,對於vue有一個專門
對於環境發布的依賴,參考:http://www.likecs.com/show-61513.html
一、安裝依賴:cross-env
使用cross-env解決跨平台設置環境變量的問題
安裝:npm i --save-dev cross-env

二、修改項目package.json文件
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"lint": "eslint --ext .js,.vue src --fix",
"build:dev": "cross-env NODE_ENV=development ENV_CONFIG=dev node build/build.js",
"build:test": "cross-env NODE_ENV=testing ENV_CONFIG=test node build/build.js",
"build:pre": "cross-env NODE_ENV=presentation ENV_CONFIG=pre node build/build.js",
"build:prod": "cross-env NODE_ENV=production ENV_CONFIG=prod node build/build.js"
},
如圖所示

這里是修改打包命令,以后打包將使用以下命令:
線上開發環境:npm run build:dev 線上測試環境:npm run build:test 線上預發環境:npm run build:pre 線上生產環境:npm run build:prod
NODE_ENV=xxx ENV_CONFIG=xxx 將設置 webpack 打包時的 NODE_ENV、 ENV_CONFIG 環境變量
三、修改項目config配置文件
修改項目config目錄下的以下文件
1、 添加test.env.js文件
'use strict'
module.exports = {
NODE_ENV: '"testing"',
ENV_CONFIG: '"test"',
API_ROOT: '"http://(線上測試環境請求地址)"'
}
2、添加pre.env.js文件
'use strict'
module.exports = {
NODE_ENV: '"presentation"',
ENV_CONFIG: '"pre"',
API_ROOT: '"http://(線上預發環境請求地址)"'
}
3、修改dev.env.js文件
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
// 命令行中獲取的NODE_ENV參數
const env = process.env.NODE_ENV
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
ENV_CONFIG: '"dev"',
API_ROOT: env === 'development' ? '"http://(線上開發環境請求地址)"' : '"/api"' // dev環境配制了服務代理,API_ROOT的api是配制的代理地址
})
4、修改prod.env.js文件
'use strict'
module.exports = {
NODE_ENV: '"production"',
ENV_CONFIG: '"prod"',
API_ROOT: '"http://(線上生產環境請求地址)"'
}
5、修改index.js文件
由於本地運行時會產生瀏覽器跨域的問題,在此文件中配置服務代理。
dev參數下修改如下配置:
proxyTable: {
'/api': {
target: 'http://(本地開發環境請求地址)',
changeOrigin: true, // 是否允許跨域
pathRewrite: {
'^/api': '' // 重寫
}
},
},
// api是配制的代理地址
如下圖所示

build參數下添加如下參數
devEnv: require('./dev.env'),
testEnv: require('./test.env'),
preEnv: require('./pre.env'),
prodEnv: require('./prod.env'),
參數名與文件名對應,此處參數將在 build/webpackage.prod.conf.js 中使用到
將 build 參數下的 assetsPublicPath 參數值修改為 ’./’
如下圖所示

config目錄結構如圖

四、修改項目build配置文件
修改項目build目錄下的以下文件
1、 修改build.js文件
// process.env.NODE_ENV = 'production' // 將此行代碼注釋
// const spinner = ora('building for production...')
const spinner = ora('building for ' + process.env.NODE_ENV + ' of ' + process.env.ENV_CONFIG + ' production...')
如圖所示

2、修改utils.js文件
添加各打包環境設置,也可以不改動,將 package.json 文件中的打包命令
cross-env NODE_ENV=xxx ENV_CONFIG=xxx node build/build.js
中的參數 NODE_ENV=xxx 都設為 NODE_ENV=production
原代碼
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
修改后
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'testing' || process.env.NODE_ENV === 'presentation'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
這里涉及到打包和本地運行時所讀取的config/index.js文件中的assetsSubDirectory參數路徑
3、修改webpack.base.conf.js文件
添加各打包環境設置,也可以不改動,將package.json文件中的打包命令
cross-env NODE_ENV=xxx ENV_CONFIG=xxx node build/build.js
中的參數 NODE_ENV=xxx 都設為 NODE_ENV=production
原代碼
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
修改后
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'testing' || process.env.NODE_ENV === 'presentation'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
4、修改webpack.prod.conf.js文件
原代碼
const env = require('../config/prod.env')
修改后
const env = config.build[process.env.ENV_CONFIG+'Env']
如圖所示

將會根據各打包環境設置的參數選擇讀取 config/index.js 文件下 build 參數中設置的環境配置參數,從而讀取到 config 目錄下配置的各打包環境的js文件
五、項目中HTTP請求設置

注意符號不是單引號而是反引號
本項目中所有請求統一在api文件中管理,在js文件中獲取到各環境配置的請求地址將其添加到請求路徑中。
如果是直接在文件中調用可將請求地址參數掛載到Vue上進行全局調用
在main.js文件中添加
Vue.prototype.baseURL = process.env.API_ROOT
使用時請求路徑參數為
url: `${this.baseURL}/platform/systemUser/login`
六、配置相當於環境cdn
再config/index.js增加如下判斷:
let cdn_path = './' if (process.env.ENV_CONFIG === 'dev') { cdn_path = 'https://dev-baidu.com/dev/wx/'; } else if (process.env.ENV_CONFIG === 'prod') { cdn_path = 'https://baidu.com/prod/wx/'; } else if (process.env.ENV_CONFIG === 'test') { cdn_path = 'https://test-baidu.com/test/wx/'; } else if (process.env.ENV_CONFIG === 'pre') { cdn_path = 'https://pre-baidu.com/pre/wx/'; } build: { ... assetsPublicPath: cdn_path, }
按照上面的步驟就可以完美解決多環境的配置了。

