Webpack中publicPath使用詳解
最近自己在搭建一個基於webpack的react專案,遇到關於output.publicPath和webpack-dev-server中publicPath的問題,而官方文件對它們的描述也不是很清楚,所以自己研究了下並寫下本文記錄。
output
output選項指定webpack輸出的位置,其中比較重要的也是經常用到的有path和publicPath
output.path
預設值:process.cwd()
output.path只是指示輸出的目錄,對應一個絕對路徑,例如在專案中通常會做如下配置:
output: { path: path.resolve(__dirname,'../dist'),}
output.publicPath
預設值:空字串
官方文件中對publicPath的解釋是
webpack 提供一個非常有用的配置,該配置能幫助你為專案中的所有資源指定一個基礎路徑,它被稱為公共路徑(publicPath)。
而關於如何應用該路徑並沒有說清楚...
其實這裡說的所有資源的基礎路徑是指專案中引用,,img等資源時候的一個基礎路徑,這個基礎路徑要配合具體資源中指定的路徑使用,所以其實打包後資源的訪問路徑可以用如下公式表示:
靜態資源最終訪問路徑 = output.publicPath + 資源loader或外掛等配置路徑
例如
output.publicPath = '/dist/' // image options: { name: 'img/[name].[ext]?[hash]' } // 最終圖片的訪問路徑為 tuKAhmloutput.publicPath + 'img/[name].[ext]?[hash]' = '/dist/img/[name].[ext]?[hash]' // js output.filename output: { filename: '[name].js' } // 最終js的訪問路徑為 output.publicPath + '[name].js' = '/dist/[name].js' // extract-text-webpack-plugin css new ExtractTextPlugin({ filename: 'style.[chunkhash].css' }) // 最終css的訪問路徑為 output.publicPath + 'style.[chunkhash].css' = '/dist/style.[chunkhash].css'
這個最終靜態資源訪問路徑在使用html-webpack-plugin打包後得到的html中可以看到。所以putuKAhmlblicPath設定成相對路徑後,相對路徑是相對於build之後的index.html的,例如,如果設定publicPath: './dist/',則打包後js的引用路徑為./dist/main.js,但是這裡有一個問題,相對路徑在訪問本地時可以,但是如果將靜態資源託管到CDN上則訪問路徑顯然不能使用相對路徑,但是如果將publicPath設定成/,則打包後訪問路徑為localhost:8080/dist/main.js,本地無法訪問
所以這裡需要在上線時候手動更改publicPath,感覺不是很方便,但是不知道該如何解決...
一般情況下publicPath應該以'/'結尾,而其他loader或外掛的配置不要以'/'開頭
webpack-dev-server中的publicPath
點選檢視官方文件中關於devServer.publicPath的介紹
在開發階段,我們借用devServer啟動一個開發伺服器進行開發,這裡也會配置一個publicPath,這裡的publicPath路徑下的打包檔案可以在瀏覽器中訪問。而靜態資源仍然使用output.publicPath。
webpack-dev-server打包的內容是放在記憶體中的,這些打包後的資源對外的的根目錄就是publicPath,換句話說,這裡我們設定的是打包後資源存放的位置
例如:
// 假設devServer的publicPath為 const publicPath = '/dist/' // 則啟動devServer後index.html的位置為 const htmlPath = `${pablicPath}index.html` // 包的位置 cosnt mainJsPath = `${pablicPath}main.js`
以上可以直接通過http://lcoalhost:8080/dist/main.js訪問到。
通過訪問 http://localhost:8080/webpack-dev-server 可以得到devServer啟動後的資源訪問路徑,如圖所示,點選靜態資源可以看到靜態資源的訪問路徑為 http://localhost:8080${publicPath}index.html
html-webpack-plugin
這個外掛用於將css和js新增到html模版中,其中template和filename會受到路徑的影響,從原始碼中可以看出
template
作用:用於定義模版檔案的路徑
原始碼:
this.options.template = this.getFullTemplatePath(this.options.template,compiler.context);
因此template只有定義在webpack的context下才會被識別,webpack context的預設值為process.cwd(),既執行 node 命令時所在的資料夾的絕對路徑
filename
作用:輸出的HTML檔名,預設為index.html,可以直接配置帶有子目錄
原始碼:
this.options.filename = path.relative(compiler.options.output.path,filename);
所以filename的路徑是相對於output.path的,而在webpack-dev-server中,則是相對於webpack-dev-server配置的publicPath。
如果webpack-dev-server的publicPath和output.publicPath不一致,在使用html-webpack-plugin可能會導致引用靜態資源失敗,因為在devServer中仍然以output.publicPath引用靜態資源,和webpack-dev-server的提供的資源訪問路徑不一致,從而無法正常訪問。
有一種情況除外,就是output.publicPath是相對路徑,這時候可以訪問本地資源
所以一般情況下都要保證devServer中的publicPath與output.publicPath保持一致。
最後
關於webpack中的path就總結這麼多,在研究關於webpack路徑的過程中看查到的一些關於路徑的零碎的知識如下:
斜槓/的含義
配置中/代表url根路徑,例如http://localhost:8080/dist/js/test.js中的http://localhost:8080/
devServer.publicPat客棧h & devServer.contentBase
- devServer.contentBase 告訴伺服器從哪裡提供內容。只有在你想要提供靜態檔案時才需要。
- devServer.publicPath 將用於確定應該從哪裡提供 bundle,並且此選項優先。
node中的路徑
- __dirname: 總是返回被執行的 js 所在資料夾的絕對路徑
- __filename: 總是返回被執行的 js 的絕對路徑
- process.cwd(): 總是返回執行 node 命令時所在的資料夾的絕對路徑
參考
詳解Webpack2的那些路徑
淺析 NodeJs 的幾種檔案路徑
專案中關於相對路徑和絕對路徑的問題
到此這篇關於Webpack中publicPath使用詳解的文章就介紹到這了,更多相關Webpack publicPath內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!