在webpack打包項(xiàng)目時(shí)經(jīng)常要處理資源的路徑問題,而通常處理方案有以下幾種
publicPath
,生成基于頁(yè)面的相對(duì)路徑publicPath
,可設(shè)置相對(duì)路徑和絕對(duì)路徑__webpack_public_path__
,js中資源路徑使用該變量, css中資源未使用項(xiàng)目路徑:
開發(fā)環(huán)境因?yàn)槎际腔?code>/根目錄所以怎么設(shè)置都OK,到了測(cè)試環(huán)境和生產(chǎn)環(huán)境路徑就無法做到適配了。
開發(fā)環(huán)境頁(yè)面地址:http://localhost:8080/index.html
開發(fā)環(huán)境資源路徑:http://localhost:8080/[js|css|img]
測(cè)試環(huán)境頁(yè)面地址:http://www.test.com/webapp/aaa/index.html
測(cè)試環(huán)境資源路徑:http://cdn.test.com/static/aaa/[js|css|img]
生產(chǎn)環(huán)境頁(yè)面地址:http://www.prod.com/webapp/aaa/index.html
生產(chǎn)環(huán)境資源路徑:http://cdn.prod.com/static/aaa/[js|css|img]
1、頁(yè)面和資源的域名和路徑都不同,不能簡(jiǎn)單的使用相對(duì)路徑
2、js中的相對(duì)路徑是針對(duì)當(dāng)前頁(yè)面,css中的相對(duì)路徑是針對(duì)當(dāng)前css文件
3、js可以定義資源路徑前綴變量,css無法使用
4、可以針對(duì)資源類型可以單獨(dú)設(shè)置publicPath
1、js中的資源路徑用引入外部變量,
比如: var imgPath = window.staticPath; //window.staticPath由后臺(tái)向index.html注入
由<img alt="" src="../assets/xx.png" />
改為<img alt="" :src="'${imgPath}/img/xx.png'" />
改成動(dòng)態(tài)的src缺點(diǎn)就是webpack不能識(shí)別這個(gè)動(dòng)態(tài)拼接的地址就無法把a(bǔ)ssets下的圖片打包的dist/img路徑下,當(dāng)然有個(gè)小技巧是兩個(gè)src都設(shè)置。
2、js中設(shè)置__webpack_public_path__
變量
比如:__webpack_public_path__ = window.resourcePath;
//window.resourcePath由后臺(tái)向index.html注入
js中img寫法不變<img alt="" src="../assets/xx.png" />
該方式的缺點(diǎn)css中的img url不能使用
3、webpack中配置images rule的publicpath
,
{
name: 'img/[name].[ext]',
publicPath:'../',
limit: 1024
}
因?yàn)?code>publicPath優(yōu)先級(jí)會(huì)大與__webpack_public_path__
所以缺點(diǎn)是js中的img src同樣會(huì)用此publicpath,而js中的相對(duì)路徑是基于當(dāng)前頁(yè)面
4、后面翻file-loader源碼發(fā)現(xiàn)publicpath,其實(shí)可以定義為一個(gè)function,
所以有了一個(gè)很傻的辦法,動(dòng)態(tài)設(shè)置publicpath
{
name: 'img/[name].[ext]',
publicPath: function(url){
if(assetsUtil.useWebpackPath(url)){
return `__webpack_public_path__ + ${JSON.stringify(url)}`
}
return '../'
},
limit: 1024
}
缺點(diǎn)就是需要維護(hù)哪些資源使用絕對(duì)路徑,哪些使用相對(duì)路徑
目前項(xiàng)目應(yīng)用的是vue-cli
,自行修改了部分配置.三個(gè)環(huán)境的情況跟你差不多,測(cè)試/生產(chǎn)環(huán)境的層級(jí)比你還深。
先說下修改了哪些配置
1-build/utils.js
下的cssLoaders
內(nèi)的generateLoaders
方法內(nèi)部的
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader',
publicPath: '../../' //此處修改是矯正iview的font等文件夾打包路徑錯(cuò)誤
})
} else {
return ['vue-style-loader'].concat(loaders)
}
2-webpack.base.conf.js
下的module
對(duì)象內(nèi)的rules
針對(duì)圖片類型的配置
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 1024,
name: utils.assetsPath('img/[folder]/[name].[ext]')
// [folder]/ 是為了保留項(xiàng)目組件文件夾內(nèi)部資源文件夾
// 在打包后在img文件夾里面對(duì)應(yīng)生成相同的文件夾,方便維護(hù)
// 另外取消了圖片的hash
}
},
3-config/index.js
dev的配置就不說了,改了端口,偶爾會(huì)修改下默認(rèn)啟動(dòng)的lolocalhost
用于移動(dòng)調(diào)試
主要是build
下的
assetsPublicPath: './',//改為./
目前這套配置運(yùn)行良好.圖片那里的修改你可以照樣引用原本的cli配置.我這是根據(jù)項(xiàng)目需求變動(dòng)的.assetsPath
如下
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。