上期回顧:從0搭建本身的webpack開發環境(一)javascript
loader
主要是用於把模塊原內容按照需求轉換成新內容,以便用來加載非 JS 模塊!
經過使用不一樣的loader
,Webpack
能夠把不一樣的文件都轉成JS文件,好比CSS、ES6/七、JSX等。
讓咱們來看看這些必需要掌握的loader!css
默認loader
的執行順序是從下到上、*從右向左,固然執行順序也能夠手動定義,接下來咱們依次介紹常見的loader
,來感覺loader
的魅力!html
咱們基於這個基礎配置來繼續編寫:java
const path = require("path"); const dev = require("./webpack.dev"); const prod = require("./webpack.prod"); const merge = require("webpack-merge"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const base = { entry:'./src/index.js', output: { filename: "[name].js", path: path.resolve(__dirname, "../dist") }, plugins: [ new HtmlWebpackPlugin({ filename: 'index.html', template: path.resolve(__dirname, "../public/template.html"), hash: true, minify: { removeAttributeQuotes: true } }), new CleanWebpackPlugin({ cleanOnceBeforeBuildPatterns: [path.resolve('xxxx/*'),'**/*'], }), ] }; module.exports = env => { if (env.development) { return merge(base, dev); } else { return merge(base, prod); } };
咱們在js
文件中引入css樣式!node
import './index.css';
再次執行打包時,會提示css沒法解析webpack
ERROR in ./src/index.css 1:4 Module parse failed: Unexpected token (1:4) You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
這個時候須要安裝loadergit
npm install style-loader css-loader --save-dev
module: { rules: [ { test: /\.css$/, use: ["style-loader", "css-loader"] } ] }
默認只在打包時進行樣式抽離github
module.exports = env => { let isDev = env.development; const base = {/*source...*/} if (isDev) { return merge(base, dev); } else { return merge(base, prod); } };
安裝抽離插件web
npm install mini-css-extract-plugin --save-dev
配置抽離插件正則表達式
{ test: /\.css$/, use: [ !isDev && MiniCssExtractPlugin.loader, isDev && 'style-loader', "css-loader" ].filter(Boolean) } !isDev && new MiniCssExtractPlugin({ filename: "css/[name].css" })
最終文件配置貼一下:
const path = require("path"); const dev = require("./webpack.dev"); const prod = require("./webpack.prod"); const merge = require("webpack-merge"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = env => { let isDev = env.development; const base = { entry: "./src/index.js", output: { filename: "[name].js", path: path.resolve(__dirname, "../dist") }, module: { rules: [ { test: /\.css$/, use: [ !isDev && MiniCssExtractPlugin.loader, isDev && 'style-loader', "css-loader" ].filter(Boolean) } ] }, plugins:[ !isDev && new MiniCssExtractPlugin({ filename: "css/[name].css" }), new HtmlWebpackPlugin({ filename: "index.html", template: path.resolve(__dirname, "../public/template.html"), hash: true, minify: { removeAttributeQuotes: true } }), ].filter(Boolean) }; if (isDev) { return merge(base, dev); } else { return merge(base, prod); } };
不一樣的css預處理器
要安裝不一樣的loader來進行解析
使用sass
{ test:/\.scss$/, use:[ !isDev && MiniCssExtractPlugin.loader, isDev && 'style-loader', "css-loader", "sass-loader" ].filter(Boolean) }
在css文件中可能會使用@import
語法引用css
文件,被引用的css
文件中可能還會導入scss
{ test: /\.css$/, use: [ !isDev && MiniCssExtractPlugin.loader, isDev && 'style-loader', { loader:"css-loader", options:{ importLoaders:1 // 引入的文件須要調用sass-loader來處理 } }, "sass-loader" ].filter(Boolean) },
使用postcss-loader
增長樣式前綴
npm install postcss-loader autoprefixer
在處理css前先增長前綴
{ test: /\.css$/, use: [ !isDev && MiniCssExtractPlugin.loader, isDev && 'style-loader', { loader:"css-loader", options:{ importLoaders:2 // 引入的文件須要調用sass-loader來處理 } }, { loader:"postcss-loader", options:{ plugins:[require('autoprefixer')] } }, "sass-loader" ].filter(Boolean) },
或者也能夠建立postcss
的配置文件postcss.config.js
module.exports = { plugins:[ require('autoprefixer') ] }
能夠配置瀏覽器的兼容性範圍 .browserslistrc
cover 99.5%
在生產環境下咱們須要壓縮css
文件,配置minimizer
選項,安裝壓縮插件
npm i optimize-css-assets-webpack-plugin terser-webpack-plugin --save-dev
在webpack.prod.js
文件中配置壓縮
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const TerserJSPlugin = require('terser-webpack-plugin'); optimization:{ minimizer:[new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})] }
咱們能夠合理的使用hash
戳,進行文件的緩存
!isDev && new MiniCssExtractPlugin({ filename: "css/[name].[contentHash].css" })
import logo from './webpack.png'; let img = document.createElement('img'); img.src = logo; document.body.appendChild(img);
使用file-loader
,會將圖片進行打包,並將打包後的路徑返回
{ test:/\.jpe?g|png|gif/, use:{ loader:'file-loader', options:{ name:`img/[name].[ext]` } } }
二進制文件也是使用file-loader
來打包
{ test:/woff|ttf|eot|svg|otf/, use:{ loader:'file-loader' } }
使用url-loader
將知足條件的圖片轉化成base64,不知足條件的url-loader
會自動調用file-loader
來進行處理
{ test:/\.jpe?g|png|gif/, use:{ loader:'url-loader', options:{ limit:100*1024, name:`img/[name].[ext]` } } }
經過對loader的使用,咱們瞭解到loader能夠把其餘類型模塊都處理成JS模塊,以便加載使用。這其實就是webpack中很是重要的混淆依賴中的一部分。
下一篇文章咱們將一塊兒來探討如何解析處理JS模塊,但願你們繼續關注和支持!