前面三節,我主要給你們分享了有關webpack的一些配置的知識點,如何打包js文件,而若是咱們遇到其餘類型的資源如圖片、css、字體font等等,咱們該如何處理呢?今天會介紹預處理器(loader),它賦予了Webpack可處理不一樣資源類型的能力,極大豐富了其可擴展性。javascript
若是想了解Webpack的基礎配置能夠參考如下地址:css
在一個項目中,咱們要面臨着各類各樣的資源,如何讓Webpack很好的處理這些資源呢?這個時候咱們須要藉助於預處理器(loader),loader的字面意思是裝載器,在Webpack中它的實際功能則更像是預處理器。Webpack自己只認識JavaScript,對於其餘類型的資源必須預先定義一個或多個loader對其進行轉譯,輸出爲Webpack可以接收的形式再繼續進行,所以loader作的其實是一個預處理的工做。html
// common.css body { font-size: 20px; background: #0fc; }
//index.js import './common.css'
執行的結果如上圖,因而可知,Webpack是沒法處理css文件,咱們須要給安裝預處理css-loader。安裝步驟以下前端
npm install --save-dev css-loader
而後咱們將loader 引入項目中,配置webpack.config.js配置以下:java
const path = require('path') module.exports = { context: path.join(__dirname, './src'), entry: { index: './index.js' }, output: { path: path.join(__dirname, 'dist'), filename: 'index.js' }, mode: 'development', module: { rules: [ { test: /\.css$/i, use: [ 'css-loader'], }, ], } }
與loader相關的配置都在module對象中,其中module.rules表明了模塊的處理規則。每條規則內部能夠包含不少配置項,這裏咱們只使用了最重要的兩項—test和use。node
不少時候,在處理某一類資源時咱們都須要使用多個loader。如,對於SCSS類型的資源來講,咱們須要sass-loader來處理其語法,並將其編譯爲CSS;接着再用css-loader處理CSS的各種加載語法;最後使用style-loader來將樣式字符串包裝成style標籤插入頁面。
下面引入style-loader,安裝命令以下:webpack
npm install --save-dev style-loader
配置代碼以下:web
const path = require('path') module.exports = { context: path.join(__dirname, './src'), entry: { index: './index.js' }, output: { path: path.join(__dirname, 'dist'), filename: 'index.js' }, mode: 'development', module: { rules: [ { test: /\.css$/i, use: ['style-loader', 'css-loader'], }, ], } }
此時再進行打包,樣式就會生效了,應該會看到頁面中插入了一個style標籤,包含了CSS文件的樣式,這樣咱們就完成了從JS文件加載CSS文件的配置。
打包效果以下圖:
運行效果以下圖
把style-loader放在css-loader前面,這是由於在Webpack打包時是按照數組從右邊往左邊的順序將資源交給loader處理的,所以要把最後生效的放在左邊。正則表達式
loader做爲預處理器一般會給開發者提供一些配置項,在引入loader的時候能夠經過options將它們傳入typescript
module: { rules: [ { test: /\.css$/i, use: ['style-loader', { loader: 'css-loader', options: { // 有關css-loader的配置 } } ], }, ], }
module: { rules: [ { test: /\.css$/i, use: ['style-loader', 'css-loader'], exclude: /node_modules/ }, ], }
exclude規則內的使node_modules中的模塊不會執行這條規則。該配置項一般是必加的,不然可能拖慢總體的打包速度。
module: { rules: [ { test: /\.css$/i, use: ['style-loader', 'css-loader'], include: /src/ }, ], }
include表明該規則只對正則匹配到的模塊生效。假如咱們將include設置爲工程的源碼目錄,天然而然就將node_modules等目錄排除掉了。
若是exclude 和include同時存在,則exclude權限比較高
resource與issuer可用於更加精確地肯定模塊規則的做用範圍,在Webpack中,咱們認爲被加載模塊是resource,而加載者是issuer
module: { rules: [ { use: ['style-loader', 'css-loader'], resource: { test: /\.css$/i, exclude: /node_modules/ }, issuer: { test: /\.js$/i, exclude: /node_modules/ } }, ], }
經過添加resource對象來將外層的配置包起來,區分了resource和issuer中的規則,這樣就一目瞭然了。
enforce用來指定一個loader的種類,只接收「pre」或「post」兩種字符串類型的值。事實上,咱們也能夠不使用enforce而只要保證loader順序是正確的便可。配置enforce主要的目的是使模塊規則更加清晰,可讀性更強,尤爲是在實際工程中,配置文件可能達到上百行的狀況,難以保證各個loader都按照預想的方式工做,使用enforce能夠強制指定loader的做用順序。
npm install babel-loader babel-core babel-preset-env
{ test: /\.js$/, exclude: /(node_modules|bower_components)/, use: { loader: 'babel-loader', options: { cacheDirectory: true, presets: [ [ 'env', { modules: false } ] ] } } }
因爲babel文件很大沒,因此要排除node_modules|bower_components
對於babel-loader自己咱們添加了cacheDirectory配置項,它會啓用緩存機制,在重複打包未改變過的模塊時防止二次編譯,一樣也會加快打包的速度
babel-loader支持從.babelrc文件讀取Babel配置,所以能夠將presets和plugins從Webpack配置文件中提取出來,也能達到相同的效果。
npm install ts-loader typescript
webapck.config.js配置以下
rules: [ { test: /\.ts$/, use:'ts-loader' } ]
有關Webpack預處理器(loader)就暫時分析到這裏,這僅表明我的觀點,歡迎拍磚,如想了解更多請掃描下面: