webpack查缺補漏

  webpack是模塊化打包工具,經過webpack,可使得咱們更加方便地組織代碼、壓縮、轉譯等等。 可是學習webpack也須要必定的成本,這裏記錄使用webpack許久以來一些模糊的知識點,方便之後查閱。css

  https://webpack.js.org/configuration/ (該配置文件能夠幫助咱們快速理解實際項目中的配置屬性)html

1. var path = require('path'),其中的path須要咱們安裝嗎? vue

  不須要。 使用了node環境以後,path模塊是node提供了的,因此不須要進行npm install path這樣的操做。 node

 

2. webpack的好處有哪些 ?react

  開頭就說了,使用webpack能夠方便咱們組織代碼,好比一個項目依賴於某個庫,咱們能夠直接將這個庫的js放在html中,而後再在另外一處引入js文件,這個js使用了這個庫,可是他們卻沒有明顯的依賴關係,而且在項目稍大時,不只依賴關係很難控制,而且會引入不少文件,發送多個http請求。 可是使用了webpack以後,咱們就能夠從一個入口文件開始組織依賴關係,這樣的關係就很明確,而且最終能夠打包到一個js中,減小了http請求。webpack

 

3. 必須在根目錄下添加一個webpack.config.js文件嗎? 名字不能改變? 位置不能改變? 既然可使用CLI,爲何還要使用配置文件呢? web

  不是的。 通常,在根目錄下回有一個webpack.config.js,而後在CLI工具中使用weibpack命令就能夠就能夠默認找到根目錄下的webpack.config.js進行打包,而咱們也能夠起一個別的配置文件的名字,如my.config.js,只是這時咱們須要指定相應的參數,如 webpack --config my.config.js ,只是這時仍是默認根目錄。 好處在於這種方法對於大型項目,配置文件可能不僅一個,咱們須要自定義名稱。 vue-cli

  雖然可使用CLI完成相同的命令,可是每次你都須要輸入一大段命令。 而若是使用了配置文件, 就只須要webpack, 更多設置就由配置文件來提示了。express

  固然,另一種更爲方便和普遍使用的方法就是使用npm scripts,如npm run build,在package.json中的scripts中使用"build": "webpack"便可。npm

 

4. 在作項目時,咱們發如今配置webpack的過程當中,想要在jsx文件中引入圖片或者是css都不能成功,這是爲何? 

  由於webpack認爲這個項目中的全部文件都是模塊,都是他所關心的。 遺憾的是,webpack只認識js文件, 對於js的處理沒有問題,可是對於css文件、圖片、設置js衍生出的jsx文件都是不能識別的,若是但願正常引用這些文件,咱們必需要使用webpack四大核心概念(entry、output、plugins、loaders)中的loaders,即模塊加載器,好比對於通常的react項目,咱們須要保證的是jsx、css、less以及圖片的正常加載,配置文件以下所示:

module.exports = {
    entry: ["./src/index.js"],
    output: {
        path: __dirname + "/dist",
        filename: "bundle.js"
    },
    watch: true,
    module: {
        loaders: [
        {
            test: /\.jsx?$/,
            loader: 'babel-loader',
            exclude: /node_modules/,
            query: {
                presets: ['es2015', 'react']
            }
        },
        {
            test: /\.css$/,
            loader: 'style-loader!css-loader'
        },
        {
            test: /\.less$/,
            use: [{
                 loader: "style-loader" // creates style nodes from JS strings
             }, {
                 loader: "css-loader" // translates CSS into CommonJS
             }, {
                 loader: "less-loader" // compiles Less to CSS
             }]
        },
        {
            test: /\.(jpg|png|svg)$/,
            loader: 'url-loader'
        }
        ]
    }
}

即test屬性用於檢測文件類型,而loader屬性用於說明使用的加載器。

babel-loader用於加載jsx文件,css-loader用於尋找全部的css文件、style-loader用於嵌入css文件到html中,style-loader、css-loader、less-loader三者配合處理less文件,對於圖片文件也須要url-loader加載器才能完成模塊的加載。 

  

5. 第四個問題中,咱們提到了loaders的做用,可是在官網上能夠發現loaders內容下的例子使用的倒是rules,那麼loaders和rules的區別是什麼呢? 

  在stackoverflow上,咱們能夠發現這個問題:https://stackoverflow.com/questions/43002099/rules-vs-loaders-in-webpack-whats-the-difference ,即loaders的使用大多在webpack1,而rules是用在webpack2中的,而且 loaders 在將來將會被廢棄。 

  官網上的介紹以下:

const path = require('path');

const config = {
  entry: './path/to/my/entry/file.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-first-webpack.bundle.js'
  },
  module: {
    rules: [
      { test: /\.txt$/, use: 'raw-loader' }
    ]
  }
};

module.exports = config;

 

可是在使用這種方法時對於jsx的query、exclude會出現一些問題,目前還沒有解決。 由於使用webpack2和1有所不一樣,須要在stackoverflow進一步尋找答案。

 

6. loaders和plugins的區別是什麼? 實例? 

  loaders的做用大可能是爲了解決單個文件的,將之轉化爲模塊,可是plugins是一個更爲強大、有力的針對打包的文件進行編譯等的工具,loaders的使用通常都是直接針對不一樣的文件使用不一樣的loader,可是plugins的使用是先經過require引入,而後在plugins中使用new建立實例才能完成的。  

 

 

7. 爲何有時候以爲引用的相對路徑沒有問題,可是在控制檯中看到的是404 not found? 在webpack配置文件中output裏的path和publicPath的區別是什麼(node端如此)

  https://webpack.js.org/configuration/output/#output-publicpath

  通常path都會結合內置的path模塊來使用,而publicPath不是的。path是說最終打包到的位置,而publicPath的做用是引用外部資源的位置。二者是徹底不一樣的。 其默認是「」。 好比在我以前作的vue項目中: 

  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },

  接着找到config中的,build中的以下:

    assetsPublicPath: '/bbg/wechat2/',

  即咱們在服務器上使用資源,尤爲是使用node做爲本地服務器時,若是publicPath設置有問題,就沒法獲取資源。 

 

  好比,咱們在使用node做爲服務器端的時候,在app.get()時返回一個html頁面,這個頁面中使用link引入了外部css文件或者使用script引入了外部js文件,這時先進行打包,而後再運行這個文件,那麼咱們就能夠發現報錯404, 這時,在node端添加下面的幾行代碼:

// serve pure static assets
var staticPath = path.posix.join('/', 'static')
app.use(staticPath, express.static('./static'))

  即放在server端的純靜態文件,這樣,就不會報出404錯誤了。

 

8. 在使用react、webpack配置時,能夠發現咱們html的末尾添加了bundle.js(注意: 這是我提早就添加好的,而不是讓webpack自動添加的),那麼這個bundle.js因爲打包到了dist下而沒有到static下,因此在引用時還會出現404錯誤,這個應該怎麼解決呢? 

  解決方法一:最簡單的解決方法固然是直接將打包的文件打包到static下,而不是dist下,可是這樣的項目是難以理解的。 通過嘗試: 確實是可行的。 

  解決方法二:即咱們只是但願在開發環境中使用(dev), 而不是在生產環境中使用,其實和vue-cli生成的項目相似,咱們是沒有必要將bundle.js打包到dist下的,而是直接運行起來便可。 

相關文章
相關標籤/搜索