webpack中的path、publicPath和contentBase

happy137發表於2018-09-30

本文主要總結一下webpack裡面關於path、publicPath和contentBase的區別及用法。

  • output裡面的path表示的是output目錄對應的一個絕對路徑。
  • output裡面的publicPath表示的是打包生成的index.html檔案裡面引用資源的字首
  • devServer裡面的publicPath表示的是打包生成的靜態檔案所在的位置(若是devServer裡面的publicPath沒有設定,則會認為是output裡面設定的publicPath的值)
  • devServer裡面的contentBase表示的是告訴伺服器從哪裡提供內容。(只有想提供靜態檔案時才需要)

基本配置

目錄結構

- src
  - index.css
  - index.js
- index.html  
- package.json
- webpack.config.js
複製程式碼

webpack.config.js

const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')

module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist') 
    },
    mode: 'development',
    module: {
        rules: [
            {
                test: /\.css/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader'
                ]
            }
        ]
    },
    devtool: 'source-map',
    plugins: [
        new HtmlWebpackPlugin({
            filename: 'index.html',
            template: './src/index.html'
        }),
        new MiniCssExtractPlugin({
            filename: 'style.css'
        }),
        new webpack.HotModuleReplacementPlugin()
    ]
}
複製程式碼

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>webpack-dev-server</title>
</head>
<body>
  <div id="app">aaa</div>
</body>
</html>
複製程式碼

index.css

#app {
    color: red;
}
複製程式碼

index.js

import './index.css'
複製程式碼

package.json

在裡面新增兩條命令

"scripts": {
    ...,
    "build": "webpack",
    "dev": "webpack-dev-server --open chrome"
}
複製程式碼

下面通過例子來了解一下path、publicPath和contentBase的區別吧。

output

output 屬性告訴 webpack 在哪裡輸出它所建立的 bundles,以及如何命名這些檔案,預設值為 ./dist。基本上,整個應用程式結構,都會被編譯到你指定的輸出路徑的資料夾中。

path

output裡面的path很好理解,指的就是output目錄對應的一個絕對路徑。

output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist') // 輸出目錄對應的絕對路徑
},
複製程式碼

執行npm run build 命令打包檔案,可以看到打包之後的檔案都輸出到了dist資料夾。

publicPath

output中的publicPath常用於在生產環境。它會為所有的資源指定一個基礎路徑。設定了publicPath後,會為資源新增一個字首。 看例子: 將output中的配置改為:

output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist'), // 輸出目錄對應的絕對路徑
        publicPath: '/outputdist/'
},
複製程式碼

執行npm run dev 命令 可以看到命令列顯示如下資訊:

webpack中的path、publicPath和contentBase

  • 訪問http://localhost:8080/ 結果顯示:
    webpack中的path、publicPath和contentBase
  • 訪問http://localhost:8080/outputdist/ 結果顯示:

webpack中的path、publicPath和contentBase

由上面兩張圖可以看出,在output裡面設定了publicPath以後,若是devServer裡面沒有設定publicPath,則使用webpack-dev-server 在進行打包時生成的靜態檔案所在的位置以及index.html檔案裡面引用資源的字首都是output.publicPath裡面設定的值

devServer

publicPath

新增devServer的配置:

devServer: {
    hot: true,
    publicPath: '/dist/'
}
複製程式碼

然後執行npm run dev, 命令列顯示如下資訊:

webpack中的path、publicPath和contentBase

  • 訪問http://localhost:8080/結果顯示:
    webpack中的path、publicPath和contentBase
  • 訪問http://localhost:8080/dist/ 結果顯示:
    webpack中的path、publicPath和contentBase
    控制檯會提示找不到相關檔案:
    webpack中的path、publicPath和contentBase

可以看出devServer裡面的publicPath表示的是打包生成的靜態檔案所在的位置。並且它的優先順序是最高的。而publicPath代表的是index.html檔案裡面引用資源的字首

contentBase

新增contentBase的配置:

devServer: {
        contentBase: './aaa', // 不設定的話,預設是當前執行的目錄,一般是專案根目錄。會在專案根目錄查詢index.html檔案。
        hot: true,
        publicPath: '/dist/'
},
複製程式碼

然後執行npm run dev, 命令列顯示如下資訊:

webpack中的path、publicPath和contentBase
可以看出contentBase指的是不是由webpack打包生成的靜態檔案

  • 訪問http://localhost:8080/結果顯示:
    webpack中的path、publicPath和contentBase
    因為我們並沒有aaa目錄,所以根本找不到。而前面的設定沒有設定contentBase,會使用contentBase的預設值,預設就是根目錄。訪問http://localhost:8080/,由於在根目錄下沒有找到index.html檔案,因此會顯示根目錄下的資原始檔。
  • 訪問http://localhost:8080/dist/,顯示的結果為:
    webpack中的path、publicPath和contentBase
    可見,contentBase與打包生成的靜態檔案所在的位置和index.html裡面引入資源的字首是沒有影響的。

更改一下配置:

devServer: {
        contentBase: './src', // 不設定的話,預設是當前執行的目錄,一般是專案根目錄。會在專案根目錄查詢index.html檔案。
        hot: true,
        publicPath: '/dist/'
},
複製程式碼

將contentBase設定為src目錄,src目錄裡面是有index.html檔案的。看一下執行結果。 執行npm run dev, 訪問http://localhost:8080/結果顯示:

webpack中的path、publicPath和contentBase
可以看出,訪問的是我們在本地編寫的index.html檔案。

相關文章