2020-09-08 2 使用Loader

Webpack 把一切文件看作模塊,CSS 文件也不例外,要引入 main.css 需要像引入 JavaScript 文件那樣,修改入口文件 main.js 如下:

// 通過(guò) CommonJS 規(guī)范導(dǎo)入 CSS 模塊
require('./main.css');
// 通過(guò) CommonJS 規(guī)范導(dǎo)入 show 函數(shù)
const show = require('./show.js');
// 執(zhí)行 show 函數(shù)
show('Webpack');

但是這樣修改后去執(zhí)行 Webpack 構(gòu)建是會(huì)報(bào)錯(cuò)的,因?yàn)?Webpack 不原生支持解析 CSS 文件。要支持非 JavaScript 類型的文件,需要使用 Webpack 的 Loader 機(jī)制。Webpack的配置修改使用如下:

const path = require('path');

module.exports = {
  // JavaScript 執(zhí)行入口文件
  entry: './main.js',
  output: {
    // 把所有依賴的模塊合并輸出到一個(gè) bundle.js 文件
    filename: 'bundle.js',
    // 輸出文件都放到 dist 目錄下
    path: path.resolve(__dirname, './dist'),
  },
  module: {
    rules: [
      {
        // 用正則去匹配要用該 loader 轉(zhuǎn)換的 CSS 文件
        test: /\.css$/,
        use: ['style-loader', 'css-loader?minimize'],
      }
    ]
  }
};

Loader 可以看作具有文件轉(zhuǎn)換功能的翻譯員,配置里的 module.rules 數(shù)組配置了一組規(guī)則,告訴 Webpack 在遇到哪些文件時(shí)使用哪些 Loader 去加載和轉(zhuǎn)換。 如上配置告訴 Webpack 在遇到以 .css 結(jié)尾的文件時(shí)先使用 css-loader 讀取 CSS 文件,再交給 style-loader 把 CSS 內(nèi)容注入到 JavaScript 里。 在配置 Loader 時(shí)需要注意的是:

  • use 屬性的值需要是一個(gè)由 Loader 名稱組成的數(shù)組,Loader 的執(zhí)行順序是由后到前的;
  • 每一個(gè) Loader 都可以通過(guò) URL querystring 的方式傳入?yún)?shù),例如 css-loader?minimize 中的 minimize 告訴 css-loader 要開啟 CSS 壓縮。

在重新執(zhí)行 Webpack 構(gòu)建前要先安裝新引入的 Loader:

npm i -D style-loader css-loader

安裝成功后重新執(zhí)行構(gòu)建時(shí),你會(huì)發(fā)現(xiàn) bundle.js 文件被更新了,里面注入了在 main.css 中寫的 CSS,而不是會(huì)額外生成一個(gè) CSS 文件。 但是重新刷新 index.html 網(wǎng)頁(yè)時(shí)將會(huì)發(fā)現(xiàn) Hello,Webpack 居中了,樣式生效了! 也許你會(huì)對(duì)此感到奇怪,第一次看到 CSS 被寫在了 JavaScript 里!這其實(shí)都是 style-loader 的功勞,它的工作原理大概是把 CSS 內(nèi)容用 JavaScript 里的字符串存儲(chǔ)起來(lái), 在網(wǎng)頁(yè)執(zhí)行 JavaScript 時(shí)通過(guò) DOM 操作動(dòng)態(tài)地往 HTML head 標(biāo)簽里插入 HTML style 標(biāo)簽。

給 Loader 傳入屬性的方式除了有 querystring 外,還可以通過(guò) Object 傳入,以上的 Loader 配置可以修改為如下:

use: [
  'style-loader', 
  {
    loader:'css-loader',
    options:{
      minimize:true, // 設(shè)置屬性報(bào)錯(cuò),說(shuō)沒(méi)有這個(gè)屬性,具體原因不知道
    }
  }
]

除了在 webpack.config.js 配置文件中配置 Loader 外,還可以在源碼中指定用什么 Loader 去處理文件。 以加載 CSS 文件為例,修改上面例子中的 main.js 如下:

require('style-loader!css-loader?minimize!./main.css');

這樣就能指定對(duì) ./main.css 這個(gè)文件先采用 css-loader 在采用 style-loader 轉(zhuǎn)換。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容