--- 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一樣??