Webpack 常用配置

在上一篇 Webpack 快速上手中慷嗜,我們對(duì) Webpack 已經(jīng)有了一個(gè)大概的了解洞斯,現(xiàn)在我們開(kāi)始了解 Webpack 的配置屡萤。

webpack.config.js

const path = require('path');
// 引入 html-webpack-plugin
const HtmlWebpackPlugin = require('html-webpack-plugin')
// 引入 clean-webpack-plugin
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

const time = new Date().getTime()

module.exports = {
    // 入口
    // entry: './src/index.js',
    entry: {
        index: './src/index.js',
        print: './src/print.js',
        another: './src/another_module.js'
    },

    devServer: {
        contentBase: './dist',  // 資源位置
        host: 'localhost',  // 服務(wù)器地址先匪,如果需要在其他 PC 上訪問(wèn)坤按,則將 'localhost' 改為 '0.0.0.0'
        port: '8080',
        hot: true  // 熱加載
    },

    devtool: 'eval-cheap-module-source-map',  // source-map 模式

    // 插件
    plugins: [
        // 清理 ./dist 目錄無(wú)用的文件
        new CleanWebpackPlugin(),
        // new webpack.HotModuleReplacementPlugin(),
        // 生成 html 文檔,并自動(dòng)引入「輸出」文檔
        new HtmlWebpackPlugin({
            title: '管理輸出'
        })
    ],

    // 輸出
    output: {
        // filename: 'main.js',
        filename: '[name].bundle.' + time + '.js',  // 輸出文件名格式
        path: path.resolve(__dirname, 'dist')  // 輸出文件位置
    },

    // 代碼分離盲厌,將重復(fù)引用的代碼分離出來(lái)
    optimization: {
        splitChunks: {
            chunks: 'all'
        }
    },

    // 模塊
    module: {
        rules: [
            {
                // 樣式加載模塊
                test: /\.css$/i,
                use: ['style-loader', 'css-loader']
            },
            {
                // 圖像加載模塊
                test: /\.(png|svg|jpg|jpeg|gif)$/i,
                type: 'asset/resource'
            },
            {
                // 字體加載模塊
                test: /\.(woff|woff2|eot|ttf|otf)$/i,
                type: 'asset/resource'
            },
            /*********** 數(shù)據(jù)加載模塊 >>> ************/
            {
                // csv 加載模塊
                test: /\.(csv|tsv)$/i,
                use: ['csv-loader']
            },
            {
                // xml 加載模塊
                test: /\.xml$/i,
                use: ['xml-loader']
            }
            // json 加載模塊:因 nodejs 默認(rèn)支持 JSON 加載署照,所以無(wú)需再安裝第三方模塊
            /*********** <<< 數(shù)據(jù)加載模塊 ************/
            , {
                // babel 加載模塊
                test: /\.js$/,
                // exclude: /(node_mod)/
                loader: 'babel-loader',
                // include: [resolve('src'), resolve('node_modules/webpack-dev-server/client')]
                // use: {
                //   loader: 'babel-loader',
                //   options: {
                //     presets: ['@babel/preset-env']
                //   }
                // }
            }
        ]
    }
}

對(duì)應(yīng)的 package.json

{
  "name": "webpack-test",
  "version": "1.0.0",
  "description": "",
  "private": true,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "_start": "webpack serve --open firefox",
    "start": "webpack serve --inline --progress",
    "build": "webpack"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/cli": "^7.12.10",
    "@babel/core": "^7.12.10",
    "@babel/plugin-transform-runtime": "^7.12.10",
    "@babel/preset-env": "^7.12.11",
    "babel-loader": "^8.2.2",
    "clean-webpack-plugin": "^3.0.0",
    "css-loader": "^5.0.1",
    "csv-loader": "^3.0.3",
    "html-webpack-plugin": "^4.5.0",
    "style-loader": "^2.0.0",
    "webpack": "^5.4.0",
    "webpack-cli": "^4.2.0",
    "webpack-dev-server": "^3.11.0",
    "xml-loader": "^1.2.1"
  },
  "dependencies": {
    "@babel/polyfill": "^7.12.1",
    "lodash": "^4.17.20"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ]
}

分步講解

  1. 入口entry
    在此我們可以看到,entry由單條更改為了對(duì)象方式吗浩,也就是說(shuō)建芙,我們的入口不僅僅可以只有一個(gè),更是可以擁有多個(gè)入口拓萌。通過(guò)上一篇文章的學(xué)習(xí)岁钓,我們知道 webpack 可以打包使用了的資源,而entry提供了一個(gè)打包的入口微王,通過(guò)這個(gè)入口屡限,就可以將入口文件里面所有相關(guān)的資源(遞歸搜索)打包在一起。

  2. 開(kāi)發(fā)模式下的小服務(wù)器 devServer
    webpack-dev-server 提供了一個(gè)簡(jiǎn)單的 web 服務(wù)器炕倘,并且能夠?qū)崟r(shí)重新加載(live reloading)钧大。

    執(zhí)行命令安裝 webpack-dev-server

npm install webpack-dev-server -D --registry=https://registry.npm.taobao.org

進(jìn)行如上配置之后,可以在 package.json 中增加腳本啟動(dòng)方式 start

{
  "name": "webpack_test",
  "version": "1.0.0",
  "description": "",
  "private": true,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack serve --inline --progress",
    "build": "webpack"
  },
  "keywords": [],
  "...": ...
}

然后在命令行中執(zhí)行如下命令啟動(dòng)服務(wù)器

npm start

此處僅為示例罩旋,更多配置請(qǐng)參考 webpack-dev-server

  1. 開(kāi)發(fā)工具devtool
    此選項(xiàng)控制是否生成啊央,以及如何生成 source map眶诈。

    我們打包過(guò)后的代碼和我們自己寫(xiě)的源碼是不一樣的,如果沒(méi)有 source map 瓜饥,那么在開(kāi)發(fā)過(guò)程中調(diào)試程序的時(shí)候逝撬,代碼報(bào)錯(cuò)時(shí),我們無(wú)法將錯(cuò)誤準(zhǔn)確的定位到我們的源碼中乓土。

    有關(guān)詳細(xì)信息請(qǐng)參考 Devtool

  2. 插件 plugins
    plugins 選項(xiàng)用于以各種方式自定義 webpack 構(gòu)建過(guò)程宪潮。webpack 附帶了各種內(nèi)置插件,可以通過(guò) webpack.[plugin-name] 訪問(wèn)這些插件趣苏。請(qǐng)查看 插件頁(yè)面 獲取插件列表和對(duì)應(yīng)文檔狡相, 但請(qǐng)注意這只是其中一部分,社區(qū)中還有許多插件食磕。

    如果你想自己寫(xiě)一個(gè)插件尽棕,請(qǐng)參考如何 編寫(xiě)一個(gè)插件

    這里我緊用了幾個(gè)插件示例。

    html-webpack-plugin 插件:可以為我們動(dòng)態(tài)生成 html 文檔彬伦,并自動(dòng)引入「output」打包之后的文檔到該 html 文檔中滔悉。

    clean-webpack-plugin 插件:在我們每次打包工程之前,它將為我們清空目標(biāo)輸出目錄媚朦,以保證輸出目錄中的資源都是我們最后需要的氧敢。

  3. 輸出 output
    可以通過(guò)配置 output 選項(xiàng)日戈,告知 webpack 如何向硬盤(pán)寫(xiě)入編譯文件询张。注意,即使可以存在多個(gè) entry 起點(diǎn)浙炼,但只能指定一個(gè) output 配置份氧。

    此屬性的最低要求,是為其配置一個(gè)輸出文件的文件名 output.filename

output: {
  filename: 'bundle.js',
}

如果是多個(gè)入口起點(diǎn)

output: {
  // filename: 'main.js',
  // 輸出文件名格式
  filename: '[name].bundle.' + time + '.js',
  // 輸出文件位置
  path: path.resolve(__dirname, 'dist')
}

更多配置請(qǐng)參考 output

  1. 代碼分離 optimization
    此特性能夠把代碼分離到不同的 bundle 中弯屈,然后可以按需加載或并行加載這些文件蜗帜。代碼分離可以用于獲取更小的 bundle,以及控制資源加載優(yōu)先級(jí)资厉,如果使用合理厅缺,會(huì)極大影響加載時(shí)間。

    常用的代碼分離方法有三種:

    • 入口起點(diǎn):使用 entry 配置手動(dòng)地分離代碼宴偿。
    • 防止重復(fù):使用 Entry dependencies 或者 SplitChunksPlugin 去重和分離 chunk湘捎。
    • 動(dòng)態(tài)導(dǎo)入:通過(guò)模塊的內(nèi)聯(lián)函數(shù)調(diào)用來(lái)分離代碼。

    這里用了「防止重復(fù)」的方式窄刘,并使用了 SplitChunksPlugin 插件窥妇,可以將公共的依賴模塊提取到已有的入口 chunk 中,或者提取到一個(gè)新生成的 chunk娩践。

  2. 模塊 module
    模塊 選項(xiàng)決定了如何處理項(xiàng)目中的 不同類(lèi)型的模塊活翩。

    在這里我使用了一些加載模塊 loader烹骨,都在 rules 中配置。這些 loader 可能來(lái)自第三方材泄,需要我們單獨(dú)安裝它們才能正常使用沮焕。

    [Rule]

    創(chuàng)建模塊時(shí),匹配請(qǐng)求的規(guī)則數(shù)組拉宗。這些規(guī)則能夠修改模塊的創(chuàng)建方式遇汞。 這些規(guī)則能夠?qū)δK(module)應(yīng)用 loader,或者修改解析器(parser)簿废。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末空入,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子族檬,更是在濱河造成了極大的恐慌歪赢,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件单料,死亡現(xiàn)場(chǎng)離奇詭異埋凯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)扫尖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)白对,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人换怖,你說(shuō)我怎么就攤上這事甩恼。” “怎么了沉颂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵条摸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我铸屉,道長(zhǎng)钉蒲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任彻坛,我火速辦了婚禮顷啼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昌屉。我一直安慰自己钙蒙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布怠益。 她就那樣靜靜地躺著仪搔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜻牢。 梳的紋絲不亂的頭發(fā)上烤咧,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天偏陪,我揣著相機(jī)與錄音,去河邊找鬼煮嫌。 笑死笛谦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昌阿。 我是一名探鬼主播饥脑,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼懦冰!你這毒婦竟也來(lái)了灶轰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刷钢,失蹤者是張志新(化名)和其女友劉穎笋颤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體内地,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伴澄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阱缓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片非凌。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荆针,靈堂內(nèi)的尸體忽然破棺而出敞嗡,到底是詐尸還是另有隱情,我是刑警寧澤祭犯,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布秸妥,位于F島的核電站,受9級(jí)特大地震影響沃粗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜键畴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一最盅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧起惕,春花似錦涡贱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至嘀粱,卻和暖如春激挪,著一層夾襖步出監(jiān)牢的瞬間辰狡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工垄分, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宛篇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓薄湿,卻偏偏與公主長(zhǎng)得像叫倍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子豺瘤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容