---
tags: webpack,
disqus: hackmd
---
# webpack(2) loader & plugin
小提醒,如果不知道安裝的套件是什麼,可以把名稱複製起來去google,就可以看到他的github了
---
## css
假設今天我要把css一起給打包進去的話要怎麼做??
首先呢在你的src資料夾裡面開一個css的資料夾 然後建立一支index.css的檔案
![](https://i.imgur.com/YAaMoff.png)
接著在index.css裡面打上一些css的樣式例如h1的color: green
再來我們要先安裝css-loader跟style-loader這兩隻
``` HTML=
npm install css-loader --save-dev
npm install style-loader --save-dev
//也可以寫這樣
npm install css-loader style-loader --save-dev
```
css-loader就是用來處理css的樣式
style-loader則是用來把css用$<style>$的方式給插入到html裡面
``` HTML=
module.exports = {
context: path.resolve(__dirname, './src'),
entry: {
index: './js/index.js',
about: './js/about.js'
},
output: {
path: path.resolve(__dirname, './dist'),
filename: './js/[name].js',
},
module: {
rules:[
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
}
]
}
}
```
在我們的module.exports裡再寫上一個module
``` HTML=
test: /\.css$/,
這是用來告訴他我這個檔案的副檔名是.css
```
然後告訴他我這個檔案要用css-loader跟style-loader來處理
這裡要注意的是 ues這裡的loader順序是<span style="color:red">由右至左,由下到上</span>
所以上面的use看起來就像是 先引入css再把css給插入到html
``` HTML=
import '../css/index.css';
console.log('hello123999');
```
最後再到你的index.js然後 import你的css進去然後打包
我在這裡先 輸入npm run start
![](https://i.imgur.com/gLY2OVn.png)
看到結果 到這裡就算是完成基本的打包CSS
---
## css前綴(prefix)
在寫css的時候常常會遇到某些css語法在其他瀏覽器沒作用
這時候就需要幫語法加上前綴詞
可以看到剛剛打包好的CSS 裡面的box-shadow沒有被加上前綴詞
我們先安裝 postcss-loader 跟 autoprefixer
postcss其實可以幫你做蠻多事情的像是Stylelint、Autoprefixing、CSS Modules
這裡我們只有用到 autpprefixer
``` HTML=
npm install postcss-loader --save-dev
npm install autoprefixer --save-dev
```
要使用postcss還必須要開一隻postcss.config.js的檔案
他在專案資料夾裡的層級跟webpack.config.js同層
![](https://i.imgur.com/rab6A37.png)
在postcss.config.js裡面打上這樣一段
``` HTML=
module.exports = {
plugins: [
require('autoprefixer')({
browsers: [ //設定各家瀏覽器的版本
'> 1%',
'last 5 versions',
'Firefox >= 45',
'iOS >=8',
'Safari >=8',
'ie >= 10'
]
})
]
}
```
最後回到我們的webpack.config.js
在原本的ues的陣列最後面加上一個'postcss-loader'
然後打包
``` HTML=
test: /\.css$/,
use: ['style-loader', 'css-loader', 'postcss-loader'],
```
![](https://i.imgur.com/JGnmyDb.png)
打包完後可以看到一樣的css但是box-shadow多了前綴詞
---
## sass環境
``` HTML=
npm install sass-loader --save-dev
npm install node-sass --save-dev
```
這裡介紹如何使用sass或scss來作業
先在src資料夾裡開一個sass的資料夾然後在裡面開一個index.sass的檔案
接著就可以在裡面寫一些sass的語法 例如 h1 color:red
接者安裝上面兩隻sass-loader 跟 node-sass
安裝完後回到webpack.config.js 把裡面原本的css改成下面
``` HTML=
{
test: /\.(sass|scss)$/,
use: [
'style-loader',
'css-loader',
'postcss-loader',
'sass-loader'
],
},
```
test這裡的意思是去找副檔名是.sass或.scss的檔案
在use的array最後面加上'sass-loader'
最後最後記得去index.js把原本import的css改成sass,這樣就可以打包了~
``` HTML=
import '../sass/index.sass';
```
附上結果圖
![](https://i.imgur.com/wDzOIP3.png)
---
## 獨立CSS
``` HTML=
npm install --save-dev extract-text-webpack-plugin@next
```
到目前為止我們所產出的css都是import在js裡的,這樣的做法會讓JS跟CSS同時載入
再來要介紹如何把css獨立成一隻檔案,並且讓他跟JS分開載入</br>
首先一樣先安裝套件 為什麼套件名稱後面有一個@next?
這是因為我們用的webpack是4,那這個套件目前發佈最新版本只支援到3
@next就是還沒發佈的下個版本,因為目前用起來沒什麼問題所以就先用,等到以後支援4的穩定版本出了 就可以不用@next</br>
安裝完後到webpack.config.js 捲到**module.exports**的上面然後貼上下面這段
``` HTML=
const ExtractTextPlugin = require("extract-text-webpack-plugin");
// Create multiple instances
const extractCSS = new ExtractTextPlugin('css/[name].css'); //這裡就是路徑+檔案名稱
```
然後再補上這一段到**module.exports**裡
``` HTML=
plugins: [
extractCSS //這個名稱要跟 const extractCSS 一樣
]
```
![](https://i.imgur.com/cRGh0hp.png)
再來看到module裡面的sass並把ues改成下面這樣
``` HTML=
//改後的樣子
{
test: /\.(sass|scss)$/,
use: extractCSS.extract([
'css-loader',
'postcss-loader',
'sass-loader'
]),
}
//原本的樣子
{
test: /\.(sass|scss)$/,
use: [
'style-loader',
'css-loader',
'postcss-loader',
'sass-loader'
],
},
```
可以看出第一個就是array被<span style="color: red">extractCSS.extract()</span>給包起來了
再來就是少了'style-loader',為什麼不用style-loader了,因為我們要把CSS給獨立出來,不注入到JS所以就不需要他了。</br>
到這裡基本上就差不多了,但是還要做兩件事,
第一先到index.js把我們本來import sass那斷拿掉因為沒有要注入了,然後就可以打包了,打包完之後沒意外是看不到樣式的因為我們還沒在html引入css</br>
所以去到index.html把下面這段放在head標籤裡就像我們平常引入外部css這樣
``` HTML=
<link rel="stylesheet" href="./dist/css/index.css">
```
![](https://i.imgur.com/u4nGuvl.png)
成功~
如果我不用sass只用css可不可以也分離呢??
答:一樣可以,一樣把它包起來就可以
``` HTML=
test: /\.css$/,
use: extractCSS.extract(['css-loader', 'postcss-loader']),
```
---
## 總結
簡單來說
如果我的css想要注入在js裡,那我就要用**style-loader**,並且在index.js裡面import它
如果我想要分開,那就要先安裝**extract-text-webpack-plugin**,再依照他的方法去達到分開效果,並且不需要**style-loader**
想要加入前綴詞,那就要用**postcss**
最後別忘了,要打包css,就要有**css-loader**
---
## 搬移檔案
``` HTML=
npm install file-loader --save-dev
```
file-loader作用就是用來搬移檔案,就我目前看來是這樣
``` HTML=
test: /\.html$/,
use: [{
loader: 'file-loader',
options: {
name: '[path][name].[ext]'
}
}],
```
![](https://i.imgur.com/9l4dh9Z.png)
然後把index.html檔案移到src資料夾裡面,接著打包~
目前我跟著這樣做之後,index.html就一起被包到dist資料夾裡面了
好處是可以讓src的index.html路徑跟dist的index.html一樣??