溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

webapck4配置文件無效怎么辦

發(fā)布時間:2021-06-29 15:13:33 來源:億速云 閱讀:254 作者:小新 欄目:web開發(fā)

這篇文章給大家分享的是有關(guān)webapck4配置文件無效怎么辦的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

webpack@4.x的變化

先來說下webpack4和之前版本里一些主要的變化:

1、webpack不再支持node v4,這是因為新的webpack和附屬插件使用了es6的語法,v4版本對es6不是很到位,所以,就不伺候了。

2、開始采取約定優(yōu)于配置的思路,webpack@4.x里把很多選項都設(shè)置了默認(rèn)值,比如入口就是./src,輸出目錄就是./dist,當(dāng)然如果你自己去設(shè)置,它也不會攔著。所以在用webpack@4.x的時候,我們甚至都可以沒有webpack.config.js這個配置文件也能一樣打包。

3、拆分了舊版本里的webpack,分成了用來處理邏輯的webpack和提供可執(zhí)行命令的webpack-cli,這也是有的同學(xué)把webpack裝成新版本以后會報找不到webpack-cli模塊這個錯誤的原因。

4、添加了mode選項,用來區(qū)分編譯的環(huán)境,提供了development、production和none三個選項,理論上這個選項是強制指定的,其實不指定的話它也是有默認(rèn)值的,但會給出一個warning,官方這么強烈建議了,就顯式的指定一下吧。指定方式有兩種,一是在啟動命令里:

./node_modules/.bin/webpack --mode production

另外一種就是在配置文件里指定,方式如下:

var config = {
  mode: 'production' // 可選development、production和none
}

5、配置上的變動,類似刪除了commonChunksPlugin,用optimization來代替這種。還有l(wèi)oader的用法也和1.15.0不一樣了,但這個升級是在之前版本里就有的,不是webpack@4.x帶來的。

6、性能優(yōu)化,提高了打包性能。另外從webpack2起,引入了Tree-shaking機制來提出沒有被引用的模塊。它的原理是按著引用關(guān)系重新建立一個新的依賴樹,而沒有被引用的模塊就不會被打包到最后的代碼里。之前的壓縮優(yōu)化方式是先把所有模塊都掛到樹上,然后通過分析后,刪掉沒被引用的模塊。從字面意思來看,我覺得原來的方式更像在搖樹,把沒用的搖下來。這兩種方式最后壓縮完的結(jié)果可能類似,但設(shè)計思路完全是從兩個方向走的。

7、其他。以上這些就是一些比較主要的變化,更詳細(xì)的升級文檔可以參考下官方的說明:https://github.com/webpack/webpack/releases

前言

升級webpack4,一定要去看文檔,特別是 更新說明 ,不要自持用過原本webpack就自己開始折騰。折騰到后面,可能就默默流下眼淚了。

webpack4的變化

webpack-cli抽離

webpack-cli被單獨拆了出來,使用的時候如果只是全局裝了CLI,直接執(zhí)行的時候是可以的。

webpack --config ./config/webpack.dev.js

如果是寫在npm hook里面會發(fā)現(xiàn)有點問題:

//package.json
"scripts": {
  "dev": "webpack --config ./config/webpack.dev.js"
 }
//shall
npm run dev

此時就會給提示:

One CLI for webpack must be installed. These are recommended choices, delivered as separate packages:
 - webpack-cli (https://github.com/webpack/webpack-cli)
   The original webpack full-featured CLI.
 - webpack-command (https://github.com/webpack-contrib/webpack-command)
   A lightweight, opinionated webpack CLI.
We will use "npm" to install the CLI via "npm install -D".
Which one do you like to install (webpack-cli/webpack-command):

如果是我沒有全局裝,我肯定會意識到要選一個,這個坑關(guān)鍵是我全局裝了。所以就在那折騰半天。

其實官方文檔開頭就說明了。

npm install webpack webpack-cli --save-dev

安裝完成之后,繼續(xù)執(zhí)行發(fā)現(xiàn)有warning:

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/

mode規(guī)則

配置規(guī)則:必須在production 和 development之間選擇一種,以便webpack 使用相應(yīng)模式的內(nèi)置優(yōu)化

  1. production支持所有類型的優(yōu)化已生成最優(yōu)bundles

  2. development允許注釋、提示和eval devtool devtool的差別可以參考這里

  3. production不支持watching、development針對快速增量重建進行了優(yōu)化

  4. production支持 module concatenating(Scope Hoisting)即作用域提升,可以將模塊打包在一個函數(shù)里,這樣減少了函數(shù)聲明,文件體積也會減小。 詳細(xì)參考看這里

  5. process.env.NODE_ENV被設(shè)置用來區(qū)分環(huán)境(僅僅在構(gòu)建代碼而非config里面)

  6. 有一個hidden none mode的模式可以禁用所有內(nèi)容

用法:

1、配置文件中:

module.exports = {
entry: Entrys,
mode: 'development'
}

2、cli 參數(shù)傳入

webpack --mode=development

兩種方式都是可行的,不過我遇到過一個很坑的問題,困擾自己好幾天,最后知道真相的自己眼淚掉下來后面再提這個問題。

零配置快速開始

因為一直被吐槽配置太累,加上parcel給的壓力,webpack4也支持零配置打包了。

如果沒有配置文件,會默認(rèn)以./src/index.js作為entry開始打包。

如果配置了webpack.config.js或者指定了--config 的文件路徑,則依據(jù)對應(yīng)配置文件開始。

問題表現(xiàn)

在webpack.config.js中配置了entry、mode等相關(guān)屬性,配置文件如下:

module.export = {
  mode:'production',
  entry:{
    app:'./src/test.js',
    index:'./src/test.js'
  },
  output: {
    path: process.cwd() + '/dist',
    filename: '[name].[hash].js',
    chunkFilename: '[name].[chunkhash].js',
    crossOriginLoading: 'anonymous'
  },
  cache: true,
  devtool: 'cheap-source-map',
  externals: {
    jquery: 'jQuery'
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)?$/,
        include: [
          path.resolve(__dirname, "../src")
        ],
        exclude: [
          'node_modules',
          path.resolve(__dirname, "../node_modules")
        ],
        use: [
          {
            loader: 'babel-loader',
            options:{
              presets:['es2015']
            } 
          }
        ]
      }
    ]
  },
  resolve: {
    modules: [
      'node_modules'
    ],
    extensions: [".js", ".json", ".jsx", ".css"],
  },
  devServer: {
    proxy: { // proxy URLs to backend development server
      '/api': 'http://localhost:3000'
    },
    contentBase: path.resolve(__dirname, "../dist"),
    hot: true,
    open:true
  },
  plugins: [
    new CleanWebpackPlugin(['dist']),
    new HtmlWebpackPlugin({
      title:'test'
    }),
    new webpack.HotModuleReplacementPlugin()
  ]
}

package.json命令配置:

"scripts": {
  "build": "webpack --config webpack.prod.js"
 }
//執(zhí)行打包
npm run build

發(fā)現(xiàn)始終會有上面選擇mode類型的提示,這讓人不能接受,另外提示沒有./src/index.js文件,但是我的配置入口是別的文件,這樣讓人很莫名

ERROR in Entry module not found: Error: Can't resolve './src' in '/Users/****'

本著跟著提示解決問題的原則,少文件那就建一個唄(后來發(fā)現(xiàn)這種思維有時候有用,有時候還真要慎重),問題表現(xiàn)雖然一致,實質(zhì)可能有所不同。

新建之后是可以運行了但是我們的配置文件好像沒起作用,

dist下的打包文件是默認(rèn)的main.js

而非我們指定的app和index

為了確保進入配置文件,我打了幾個log,竟然都有輸出,說明進去了,這問題就詭異了。

console.log(path.resolve(__dirname, './src')) //輸出正確路徑
module.export = {
    //*****//
  }

版本統(tǒng)一

初步猜想是版本問題,確實也有issue上提到過某些版本存在問題,對照著官方demo鎖定版本之后問題依然存在。

猜測:應(yīng)該是配置文件存在錯誤

配置檢查

將官方最基本的配置拉進來拷貝進來試了一下,依然存在問題沒能解決。

猜測:本地的環(huán)境存在問題,npm,node等版本

查看之后發(fā)現(xiàn)版本都是滿足的。

運行demo

將demo拉到本地并啟動,demo正常打包,說明本地環(huán)境是ok的。那么問題就明顯了,我的配置文件或者項目搭建有問題,對照著demo的配置項,配置項沒有明顯問題,這樣的話將,配置信息放入到demo中去,修改之后發(fā)現(xiàn)起作用,我又重新審視了下我的配置文件,不僅僅局限于配置部分的時候,發(fā)現(xiàn)

//我的寫法,這樣webpack拿到的就是undefined了。
module.export
//別人的demo
module.exports

webpack的兼容處理

webpack會將 webpack --config 傳入的文件與本身默認(rèn)配置進行merge,保證本身打包不出錯。為了證明我們的推論,將配置文件只剩下output屬性,并加上src/index.js

module.exports = {
  output: {
    path: process.cwd() + '/dist1',
    // 直接的入口模zzz塊名
    filename: '[name].js',
    // 非入口模塊,也就是不需要打包到一起的,但又可能會用到,
    // 這不就是按需加載的么
    chunkFilename: '[name].[chunkhash].js',
    crossOriginLoading: 'anonymous'
  }
}

執(zhí)行之后會發(fā)現(xiàn)打包到/dist1下面。所以上面寫錯module.exports的時候,走的完全是默認(rèn)配置。前面的log打在了module.exports之前執(zhí)行是正確的。

感謝各位的閱讀!關(guān)于“webapck4配置文件無效怎么辦”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI