一、談談對webpack的認識
- webpack是一個模組打包工具,它能夠很好地管理與打包Web開發中所用到的HTML、JS、CSS以及各種靜態檔案(圖片、字型等),讓開發過程更加高效。對於不同型別的資源,webpack有對應的模組載入器(loader)來處理。webpack會分析模組間的依賴關係,最後輸出最佳化且合併後的靜態資源。
- 在開發階段,webpack提供了一個基於Node.js Express框架的開發伺服器。開發伺服器會監聽每一個檔案的變化,進行實時打包,並且可以推送通知前端頁面程式碼發生了變化,從而實現頁面的自動重新整理。
- webpack具有5大核心:entry(入口)、output(輸出)、loader(載入器)、plugins(外掛)、mode(模式)。
entry
:指示webpack以哪些檔案作為入口,進行打包output
:指示webpack將打包後的資源輸出到哪個位置loader
:webpack本身只能處理js、json等資源,藉助loader能完成對其他資源的解析處理plugins
:擴充套件webpack功能,加入自定義的構建行為mode
:指示webpack以哪種模式進行打包,有開發模式(development)和生產模式(production)
二、常用的loader
loader主要用於對模組的原始碼進行轉換,實現對不同格式檔案的處理,常用的loader如下:
-
處理樣式資源
-
less-loader、sass-loader、stylus-loader:將各種對應的樣式檔案使用對應的loader轉化為css檔案
-
css-loader:負責將css檔案編譯成webpack能識別的模組
-
style-loader:動態建立style標籤,將css模組的內容插入
-
postcss-loader:css相容性處理
-
下載依賴
npm i postcss-loader postcss postcss-preset-env -D
-
配置
module.exports = { ...... module: { rules: [ { // 用來匹配 .css 結尾的檔案 test: /\.css$/, // use 陣列裡面 Loader 執行順序是從右到左 use: [ "css-loader", { loader: "postcss-loader", options: { postcssOptions: { plugins: [ "postcss-preset-env", // 能解決大多數樣式相容性問題 ], }, }, }, ], } ] } ...... }
-
在
package.json
檔案中新增browserslist
來控制樣式的相容性做到什麼程度{ // 其他省略 "browserslist": ["last 2 version", "> 1%", "not dead"] }
-
-
-
處理圖片資源
-
file-loader:將檔案輸出到指定的資料夾中,並在程式碼中透過相對URL引用這些檔案
-
url-loader:在檔案較小時,可以將檔案內容以Base64的格式注入到程式碼中,從而避免額外的HTTP請求
-
webpack5將上述兩個loader的功能內建到webpack了,只需要配置
type : "asset"
即可,對於Base64的處理如下所示:{ test: /\.(png|jpe?g|gif|webp)$/, type: "asset", parser: { dataUrlCondition: { maxSize: 10 * 1024 // 小於10kb的圖片會被base64處理 } } },
-
-
處理字型圖示資源和其他資源
type : "asset/resource"
:相當於file-loader,將檔案轉化成webpack能識別的模組,其他不做處理type : "asset"
:相當於url-loader,小於某個大小的資源會處理成 data URI 形式
-
處理js資源
-
Eslint:檢查程式碼格式規範
-
編寫配置檔案:專案根目錄新建
.eslintrc.*
或直接在package.json
中配置eslintConfig -
具體配置
module.exports = { // 解析選項 parserOptions: {}, // 具體檢查規則 rules: {}, // 繼承其他規則 extends: [], // ... // 其他規則詳見:https://eslint.bootcss.com/docs/user-guide/configuring };
-
parserOptions解析選項
parserOptions: { ecmaVersion: 6, // ES 語法版本 sourceType: "module", // ES 模組化 ecmaFeatures: { // ES 其他特性 jsx: true // 如果是 React 專案,就需要開啟 jsx 語法 } }
-
rules規則
- "off"或0:關閉規則
- "warn"或1:開啟規則,使用警告級別,不會導致程式退出
- "error"或2:開啟規則,使用錯誤級別,會導致程式退出
rules: { semi: "error", // 禁止使用分號 'array-callback-return': 'warn', // 強制陣列方法的回撥函式中有 return 語句,否則警告 'default-case': [ 'warn', // 要求 switch 語句中有 default 分支,否則警告 { commentPattern: '^no default$' } // 允許在最後註釋 no default, 就不會有警告了 ], eqeqeq: [ 'warn', // 強制使用 === 和 !==,否則警告 'smart' // https://eslint.bootcss.com/docs/rules/eqeqeq#smart 除了少數情況下不會有警告 ], }
-
extends繼承:繼承現有規則
eslint:recommended
:Eslint官方規則plugin:vue/essential
:Vue-cli官方規則react-app
:React-cli官方規則
// 例如在React專案中,我們可以這樣寫配置 module.exports = { extends: ["react-app"], rules: { // 我們的規則會覆蓋掉react-app的規則 // 所以想要修改規則直接改就是了 eqeqeq: ["warn", "smart"], }, };
-
webpack中使用
-
下載依賴
npm i eslint-webpack-plugin eslint -D
-
定義Eslint配置檔案
module.exports = { // 繼承 Eslint 規則 extends: ["eslint:recommended"], env: { node: true, // 啟用node中全域性變數 browser: true, // 啟用瀏覽器中全域性變數 }, parserOptions: { ecmaVersion: 6, sourceType: "module", }, rules: { "no-var": 2, // 不能使用 var 定義變數 }, };
-
在webpack.config.js中啟用
const ESLintWebpackPlugin = require("eslint-webpack-plugin"); module.exports = { ...... plugins: [ new ESLintWebpackPlugin({ // 指定檢查檔案的根目錄 context: path.resolve(__dirname, "src"), }), ] }
-
-
VS Code 中 Eslint外掛
下載 Eslint 外掛,即可不用編譯就能看到錯誤,可以提前解決。但此時就會對專案所有檔案預設進行 Eslint 檢查了,我們 dist 目錄下的打包後檔案就會報錯。可以使用 Eslint 忽略檔案解決。在專案根目錄新建
.eslintignore
檔案:# 忽略dist目錄下所有檔案 dist
-
-
Babel:對js做相容性處理
主要用於將 ES6 語法編寫的程式碼轉換為向後相容的 JavaScript 語法,以便能夠執行在當前和舊版本的瀏覽器或其他環境中
-
編寫配置檔案:專案根目錄下新建
babel.config.*
,或直接在package.json
中配置babel -
具體配置
module.exports = { // 預設 presets: [], };
-
presets 預設:就是一組Babel外掛,擴充套件Babel功能
@babel/preset-env
: 一個智慧預設,允許您使用最新的 JavaScript。@babel/preset-react
:一個用來編譯 React jsx 語法的預設@babel/preset-typescript
:一個用來編譯 TypeScript 語法的預設
-
webpack中使用
-
下載依賴
npm i babel-loader @babel/core @babel/preset-env -D
-
定義Babel配置檔案
module.exports = { presets: ["@babel/preset-env"], };
-
在webpack.config.js中啟用
{ test: /\.js$/, exclude: /node_modules/, // 排除node_modules程式碼不編譯 loader: "babel-loader", }
-
-
-