webpack中文網(一)webpack.config.js、npm run build、管理資源(各種loader)、全域資源
文章目錄
- webpack中文網(一)webpack.config.js、npm run build、管理資源(各種loader)、全域資源
- 1. 安裝
- 前提條件
- 本地安裝
- 全域安裝
- 最新體驗版本
- 2. 起步
- 基本安裝
- 創建一個 bundle 檔案
- 模塊
- 使用一個組態檔
- NPM 腳本(NPM Scripts)
- 結論
- 3. 管理資源
- 安裝
- 加載 CSS
- 加載圖片
- 加載字體
- 加載資料
- 全域資源
- 回退處理
總結:
管理資源
在使用loader加載資源之前,需要安裝對應的loader
npm install --save-dev style-loader css-loader
1. 安裝
前提條件
在開始之前,請確保安裝了 Node.js 的最新版本,使用 Node.js 最新的長期支持版本(LTS - Long Term Support),是理想的起步,使用舊版本,你可能遇到各種問題,因為它們可能缺少 webpack 功能以及/或者缺少相關 package 包,
本地安裝
最新的webpack版本是:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GTQtEtmp-1630658170231)(https://img.shields.io/npm/v/webpack.svg?label=webpack&style=flat-square&maxAge=3600)]
要安裝最新版本或特定版本,請運行以下命令之一:
npm install --save-dev webpack
npm install --save-dev webpack@<version>
如果你使用 webpack 4+ 版本,你還需要安裝 CLI,
npm install --save-dev webpack-cli
對于大多數專案,我們建議本地安裝,這可以使我們在引入破壞式變更(breaking change)的依賴時,更容易分別升級專案,通常,webpack 通過運行一個或多個 npm scripts,會在本地 node_modules 目錄中查找安裝的 webpack:
"scripts": {
"start": "webpack --config webpack.config.js"
}
當你在本地安裝 webpack 后,你能夠從
node_modules/.bin/webpack訪問它的 bin 版本,
全域安裝
以下的 NPM 安裝方式,將使 webpack 在全域環境下可用:
npm install --global webpack
不推薦全域安裝 webpack,這會將你專案中的 webpack 鎖定到指定版本,并且在使用不同的 webpack 版本的專案中,可能會導致構建失敗,
最新體驗版本
如果你熱衷于使用最新版本的 webpack,你可以使用以下命令,直接從 webpack 的倉庫中安裝:
npm install webpack@beta
npm install webpack/webpack#<tagname/branchname>
安裝這些最新體驗版本時要小心!它們可能仍然包含 bug,因此不應該用于生產環境,
2. 起步
webpack 用于編譯 JavaScript 模塊,一旦完成安裝,你就可以通過 webpack 的 CLI 或 API 與其配合互動,如果你還不熟悉 webpack,請閱讀核心概念和打包器對比,了解為什么你要使用 webpack,而不是社區中的其他工具,
基本安裝
首先我們創建一個目錄,初始化 npm,然后 在本地安裝 webpack,接著安裝 webpack-cli(此工具用于在命令列中運行 webpack):
mkdir webpack-demo && cd webpack-demo
npm init -y
npm install webpack webpack-cli --save-dev
貫穿整個指南的是,我們將使用
diff塊,來顯示我們對目錄、檔案和代碼所做的更改,
現在我們將創建以下目錄結構、檔案和內容:
project
webpack-demo
|- package.json
+ |- index.html
+ |- /src
+ |- index.js
src/index.js
function component() {
var element = document.createElement('div');
// Lodash(目前通過一個 script 腳本引入)對于執行這一行是必需的
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
return element;
}
document.body.appendChild(component());
index.html
<!doctype html>
<html>
<head>
<title>起步</title>
<script src="https://unpkg.com/lodash@4.16.6"></script>
</head>
<body>
<script src="./src/index.js"></script>
</body>
</html>
我們還需要調整 package.json 檔案,以便確保我們安裝包是私有的(private),并且移除 main 入口,這可以防止意外發布你的代碼,
如果你想要了解
package.json內在機制的更多資訊,我們推薦閱讀 npm 檔案,
package.json
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
+ "private": true,
- "main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^4.0.1",
"webpack-cli": "^2.0.9"
},
"dependencies": {}
}
在此示例中,<script> 標簽之間存在隱式依賴關系,index.js 檔案執行之前,還依賴于頁面中引入的 lodash,之所以說是隱式的是因為 index.js 并未顯式宣告需要引入 lodash,只是假定推測已經存在一個全域變數 _,
使用這種方式去管理 JavaScript 專案會有一些問題:
- 無法立即體現,腳本的執行依賴于外部擴展庫(external library),
- 如果依賴不存在,或者引入順序錯誤,應用程式將無法正常運行,
- 如果依賴被引入但是并沒有使用,瀏覽器將被迫下載無用代碼,
讓我們使用 webpack 來管理這些腳本,
創建一個 bundle 檔案
首先,我們稍微調整下目錄結構,將“源”代碼(/src)從我們的“分發”代碼(/dist)中分離出來,“源”代碼是用于書寫和編輯的代碼,“分發”代碼是構建程序產生的代碼最小化和優化后的“輸出”目錄,最終將在瀏覽器中加載:
project
webpack-demo
|- package.json
+ |- /dist
+ |- index.html
- |- index.html
|- /src
|- index.js
要在 index.js 中打包 lodash 依賴,我們需要在本地安裝 library:
npm install --save lodash
在安裝一個要打包到生產環境的安裝包時,你應該使用
npm install --save,如果你在安裝一個用于開發環境的安裝包(例如,linter, 測驗庫等),你應該使用npm install --save-dev,請在 npm 檔案 中查找更多資訊,
現在,在我們的腳本中 import lodash:
src/index.js
+ import _ from 'lodash';
+
function component() {
var element = document.createElement('div');
- // Lodash, currently included via a script, is required for this line to work
+ // Lodash, now imported by this script
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
return element;
}
document.body.appendChild(component());
現在,由于通過打包來合成腳本,我們必須更新 index.html 檔案,因為現在是通過 import 引入 lodash,所以將 lodash <script> 洗掉,然后修改另一個 <script> 標簽來加載 bundle,而不是原始的 /src 檔案:
dist/index.html
<!doctype html>
<html>
<head>
<title>起步</title>
//因為現在是通過 import 引入 lodash,所以將 lodash <script> 洗掉
- <script src="https://unpkg.com/lodash@4.16.6"></script>
</head>
<body>
//修改另一個 <script> 標簽來加載 bundle,而不是原始的 /src 檔案
- <script src="./src/index.js"></script>
+ <script src="main.js"></script>
</body>
</html>
在這個設定中,index.js 顯式要求引入的 lodash 必須存在,然后將它系結為 _(沒有全域作用域污染),通過宣告模塊所需的依賴,webpack 能夠利用這些資訊去構建依賴圖,然后使用圖生成一個優化過的,會以正確順序執行的 bundle,
可以這樣說,執行 npx webpack,會將我們的腳本作為入口起點,然后 輸出 為 main.js,Node 8.2+ 版本提供的 npx 命令,可以運行在初始安裝的 webpack 包(package)的 webpack 二進制檔案(./node_modules/.bin/webpack):
npx webpack
Hash: dabab1bac2b940c1462b
Version: webpack 4.0.1
Time: 3003ms
Built at: 2018-2-26 22:42:11
Asset Size Chunks Chunk Names
main.js 69.6 KiB 0 [emitted] main
Entrypoint main = main.js
[1] (webpack)/buildin/module.js 519 bytes {0} [built]
[2] (webpack)/buildin/global.js 509 bytes {0} [built]
[3] ./src/index.js 256 bytes {0} [built]
+ 1 hidden module
WARNING in configuration(配置警告)
The 'mode' option has not been set. Set 'mode' option to 'development' or 'production' to enable defaults for this environment.('mode' 選項還未設定,將 'mode' 選項設定為 'development' 或 'production',來啟用環境默認值,)
輸出可能會稍有不同,但是只要構建成功,那么你就可以繼續,并且不要擔心,稍后我們就會解決,
在瀏覽器中打開 index.html,如果一切訪問都正常,你應該能看到以下文本:‘Hello webpack’,
模塊
ES2015 中的 import 和 export 陳述句已經被標準化,雖然大多數瀏覽器還無法支持它們,但是 webpack 卻能夠提供開箱即用般的支持,
事實上,webpack 在幕后會將代碼“轉譯”,以便舊版本瀏覽器可以執行,如果你檢查 dist/bundle.js,你可以看到 webpack 具體如何實作,這是獨創精巧的設計!除了 import 和 export,webpack 還能夠很好地支持多種其他模塊語法,更多資訊請查看模塊 API,
注意,webpack 不會更改代碼中除 import 和 export 陳述句以外的部分,如果你在使用其它 ES2015 特性,請確保你在 webpack 的 loader 系統中使用了一個像是 Babel 或 Bublé 的轉譯器,
使用一個組態檔
在 webpack 4 中,可以無須任何配置使用,然而大多數專案會需要很復雜的設定,這就是為什么 webpack 仍然要支持 組態檔,這比在終端(terminal)中手動輸入大量命令要高效的多,所以讓我們創建一個取代以上使用 CLI 選項方式的組態檔:
project
webpack-demo
|- package.json
+ |- webpack.config.js
|- /dist
|- index.html
|- /src
|- index.js
webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
}
};
現在,讓我們通過新組態檔再次執行構建:
npx webpack --config webpack.config.js
Hash: dabab1bac2b940c1462b
Version: webpack 4.0.1
Time: 328ms
Built at: 2018-2-26 22:47:43
Asset Size Chunks Chunk Names
bundle.js 69.6 KiB 0 [emitted] main
Entrypoint main = bundle.js
[1] (webpack)/buildin/module.js 519 bytes {0} [built]
[2] (webpack)/buildin/global.js 509 bytes {0} [built]
[3] ./src/index.js 256 bytes {0} [built]
+ 1 hidden module
WARNING in configuration(配置警告)
The 'mode' option has not been set. Set 'mode' option to 'development' or 'production' to enable defaults for this environment.('mode' 選項還未設定,將 'mode' 選項設定為 'development' 或 'production',來啟用環境默認值,)
注意,當在 windows 中通過呼叫路徑去呼叫
webpack時,必須使用反斜線(),例如node_modules\.bin\webpack --config webpack.config.js,
如果
webpack.config.js存在,則webpack命令將默認選擇使用它,我們在這里使用--config選項只是向你表明,可以傳遞任何名稱的組態檔,這對于需要拆分成多個檔案的復雜配置是非常有用,
比起 CLI 這種簡單直接的使用方式,組態檔具有更多的靈活性,我們可以通過配置方式指定 loader 規則(loader rules)、插件(plugins)、決議選項(resolve options),以及許多其他增強功能,了解更多詳細資訊,請查看配置檔案,
NPM 腳本(NPM Scripts)
考慮到用 CLI 這種方式來運行本地的 webpack 不是特別方便,我們可以設定一個快捷方式,在 package.json 添加一個 npm 腳本(npm script):
package.json
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
+ "build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^4.0.1",
"webpack-cli": "^2.0.9",
"lodash": "^4.17.5"
}
}
現在,可以使用 npm run build 命令,來替代我們之前使用的 npx 命令,注意,使用 npm 的 scripts,我們可以像使用 npx 那樣通過模塊名參考本地安裝的 npm 包,這是大多數基于 npm 的專案遵循的標準,因為它允許所有貢獻者使用同一組通用腳本(如果必要,每個 flag 都帶有 --config 標志),
現在運行以下命令,然后看看你的腳本別名是否正常運行:
npm run build
Hash: dabab1bac2b940c1462b
Version: webpack 4.0.1
Time: 323ms
Built at: 2018-2-26 22:50:25
Asset Size Chunks Chunk Names
bundle.js 69.6 KiB 0 [emitted] main
Entrypoint main = bundle.js
[1] (webpack)/buildin/module.js 519 bytes {0} [built]
[2] (webpack)/buildin/global.js 509 bytes {0} [built]
[3] ./src/index.js 256 bytes {0} [built]
+ 1 hidden module
WARNING in configuration(配置警告)
The 'mode' option has not been set. Set 'mode' option to 'development' or 'production' to enable defaults for this environment.('mode' 選項還未設定,將 'mode' 選項設定為 'development' 或 'production',來啟用環境默認值,)
通過向
npm run build命令和你的引數之間添加兩個中橫線,可以將自定義引數傳遞給 webpack,例如:npm run build -- --colors,
結論
現在,你已經實作了一個基本的構建程序,你應該移至下一章節的 Asset Management 指南,以了解如何通過 webpack 來管理資源,例如圖片、字體,此刻你的專案應該和如下類似:
project
webpack-demo
|- package.json
|- webpack.config.js
|- /dist
|- bundle.js
|- index.html
|- /src
|- index.js
|- /node_modules
如果你使用的是 npm 5,你可能還會在目錄中看到一個
package-lock.json檔案,
如果你想要了解 webpack 的設計思想,你應該查看 basic concepts 和 configuration 頁面,此外,API 章節可以深入了解 webpack 提供的各種介面,
3. 管理資源
如果你是從開始一直遵循著指南的示例,現在會有一個小專案,顯示 “Hello webpack”,現在我們嘗試整合一些其他資源,比如影像,看看 webpack 如何處理,
在 webpack 出現之前,前端開發人員會使用 grunt 和 gulp 等工具來處理資源,并將它們從 /src 檔案夾移動到 /dist 或 /build 目錄中,同樣方式也被用于 JavaScript 模塊,但是,像 webpack 這樣的工具,將**動態打包(dynamically bundle)**所有依賴項(創建所謂的依賴圖(dependency graph)),這是極好的創舉,因為現在每個模塊都可以明確表述它自身的依賴,我們將避免打包未使用的模塊,
webpack 最出色的功能之一就是,除了 JavaScript,還可以通過 loader 引入任何其他型別的檔案,也就是說,以上列出的那些 JavaScript 的優點(例如顯式依賴),同樣可以用來構建網站或 web 應用程式中的所有非 JavaScript 內容,讓我們從 CSS 開始起步,或許你可能已經熟悉了這個設定程序,
安裝
在開始之前,讓我們對專案做一個小的修改:
dist/index.html
<!doctype html>
<html>
<head>
- <title>Getting Started</title>
+ <title>Asset Management</title>
</head>
<body>
<script src="./bundle.js"></script>
</body>
</html>
加載 CSS
為了從 JavaScript 模塊中 import 一個 CSS 檔案,你需要在 module 配置中 安裝并添加 style-loader 和 css-loader:
npm install --save-dev style-loader css-loader
webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
+ module: {
+ rules: [
+ {
+ test: /\.css$/,
+ use: [
+ 'style-loader',
+ 'css-loader'
+ ]
+ }
+ ]
+ }
};
webpack 根據正則運算式,來確定應該查找哪些檔案,并將其提供給指定的 loader,在這種情況下,以
.css結尾的全部檔案,都將被提供給style-loader和css-loader,
這使你可以在依賴于此樣式的檔案中 import './style.css',現在,當該模塊運行時,含有 CSS 字串的 <style> 標簽,將被插入到 html 檔案的 <head> 中,
我們嘗試一下,通過在專案中添加一個新的 style.css 檔案,并將其匯入到我們的 index.js 中:
project
webpack-demo
|- package.json
|- webpack.config.js
|- /dist
|- bundle.js
|- index.html
|- /src
+ |- style.css
|- index.js
|- /node_modules
src/style.css
.hello {
color: red;
}
src/index.js
import _ from 'lodash';
+ import './style.css';
function component() {
var element = document.createElement('div');
// lodash 是由當前 script 腳本 import 匯入進來的
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
+ element.classList.add('hello');
return element;
}
document.body.appendChild(component());
現在運行構建命令:
npm run build
Hash: 9a3abfc96300ef87880f
Version: webpack 2.6.1
Time: 834ms
Asset Size Chunks Chunk Names
bundle.js 560 kB 0 [emitted] [big] main
[0] ./~/lodash/lodash.js 540 kB {0} [built]
[1] ./src/style.css 1 kB {0} [built]
[2] ./~/css-loader!./src/style.css 191 bytes {0} [built]
[3] ./~/css-loader/lib/css-base.js 2.26 kB {0} [built]
[4] ./~/style-loader/lib/addStyles.js 8.7 kB {0} [built]
[5] ./~/style-loader/lib/urls.js 3.01 kB {0} [built]
[6] (webpack)/buildin/global.js 509 bytes {0} [built]
[7] (webpack)/buildin/module.js 517 bytes {0} [built]
[8] ./src/index.js 351 bytes {0} [built]
再次在瀏覽器中打開 index.html,你應該看到 Hello webpack 現在的樣式是紅色,要查看 webpack 做了什么,請檢查頁面(不要查看頁面源代碼,因為它不會顯示結果),并查看頁面的 head 標簽,它應該包含我們在 index.js 中匯入的 style 塊元素,
請注意,在多數情況下,你也可以進行 CSS 分離,以便在生產環境中節省加載時間,最重要的是,現有的 loader 可以支持任何你可以想到的 CSS 處理器風格 - postcss, sass 和 less 等,
加載圖片
假想,現在我們正在下載 CSS,但是我們的背景和圖示這些圖片,要如何處理呢?使用 file-loader,我們可以輕松地將這些內容混合到 CSS 中:
npm install --save-dev file-loader
webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
+ {
+ test: /\.(png|svg|jpg|gif)$/,
+ use: [
+ 'file-loader'
+ ]
+ }
]
}
};
現在,當你 import MyImage from './my-image.png',該影像將被處理并添加到 output 目錄,并且 MyImage 變數將包含該影像在處理后的最終 url,當使用 css-loader 時,如上所示,你的 CSS 中的 url('./my-image.png') 會使用類似的程序去處理,loader 會識別這是一個本地檔案,并將 './my-image.png' 路徑,替換為輸出目錄中影像的最終路徑,html-loader 以相同的方式處理 <img src="./my-image.png" />,
我們向專案添加一個影像,然后看它是如何作業的,你可以使用任何你喜歡的影像:
project
webpack-demo
|- package.json
|- webpack.config.js
|- /dist
|- bundle.js
|- index.html
|- /src
+ |- icon.png
|- style.css
|- index.js
|- /node_modules
src/index.js
import _ from 'lodash';
import './style.css';
+ import Icon from './icon.png';
function component() {
var element = document.createElement('div');
// Lodash,現在由此腳本匯入
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
element.classList.add('hello');
+ // 將影像添加到我們現有的 div,
+ var myIcon = new Image();
+ myIcon.src = Icon;
+
+ element.appendChild(myIcon);
return element;
}
document.body.appendChild(component());
src/style.css
.hello {
color: red;
+ background: url('./icon.png');
}
讓我們重新構建,并再次打開 index.html 檔案:
npm run build
Hash: 854865050ea3c1c7f237
Version: webpack 2.6.1
Time: 895ms
Asset Size Chunks Chunk Names
5c999da72346a995e7e2718865d019c8.png 11.3 kB [emitted]
bundle.js 561 kB 0 [emitted] [big] main
[0] ./src/icon.png 82 bytes {0} [built]
[1] ./~/lodash/lodash.js 540 kB {0} [built]
[2] ./src/style.css 1 kB {0} [built]
[3] ./~/css-loader!./src/style.css 242 bytes {0} [built]
[4] ./~/css-loader/lib/css-base.js 2.26 kB {0} [built]
[5] ./~/style-loader/lib/addStyles.js 8.7 kB {0} [built]
[6] ./~/style-loader/lib/urls.js 3.01 kB {0} [built]
[7] (webpack)/buildin/global.js 509 bytes {0} [built]
[8] (webpack)/buildin/module.js 517 bytes {0} [built]
[9] ./src/index.js 503 bytes {0} [built]
如果一切順利,和 Hello webpack 文本旁邊的 img 元素一樣,現在看到的圖示是重復的背景圖片,如果你檢查此元素,你將看到實際的檔案名已更改為像 5c999da72346a995e7e2718865d019c8.png 一樣,這意味著 webpack 在 src 檔案夾中找到我們的檔案,并成功處理過它!
合乎邏輯下一步是,壓縮和優化你的影像,查看 image-webpack-loader 和 url-loader,以了解更多關于如果增強加載處理圖片功能,
加載字體
那么,像字體這樣的其他資源如何處理呢?file-loader 和 url-loader 可以接收并加載任何檔案,然后將其輸出到構建目錄,這就是說,我們可以將它們用于任何型別的檔案,包括字體,讓我們更新 webpack.config.js 來處理字體檔案:
webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
{
test: /\.(png|svg|jpg|gif)$/,
use: [
'file-loader'
]
},
+ {
+ test: /\.(woff|woff2|eot|ttf|otf)$/,
+ use: [
+ 'file-loader'
+ ]
+ }
]
}
};
在專案中添加一些字體檔案:
project
webpack-demo
|- package.json
|- webpack.config.js
|- /dist
|- bundle.js
|- index.html
|- /src
+ |- my-font.woff
+ |- my-font.woff2
|- icon.png
|- style.css
|- index.js
|- /node_modules
通過配置好 loader 并將字體檔案放在合適的地方,你可以通過一個 @font-face 宣告引入,本地的 url(...) 指令會被 webpack 獲取處理,就像它處理圖片資源一樣:
src/style.css
+ @font-face {
+ font-family: 'MyFont';
+ src: url('./my-font.woff2') format('woff2'),
+ url('./my-font.woff') format('woff');
+ font-weight: 600;
+ font-style: normal;
+ }
.hello {
color: red;
+ font-family: 'MyFont';
background: url('./icon.png');
}
現在讓我們重新構建來看看 webpack 是否處理了我們的字體:
npm run build
Hash: b4aef94169088c79ed1c
Version: webpack 2.6.1
Time: 775ms
Asset Size Chunks Chunk Names
5c999da72346a995e7e2718865d019c8.png 11.3 kB [emitted]
11aebbbd407bcc3ab1e914ca0238d24d.woff 221 kB [emitted]
bundle.js 561 kB 0 [emitted] [big] main
[0] ./src/icon.png 82 bytes {0} [built]
[1] ./~/lodash/lodash.js 540 kB {0} [built]
[2] ./src/style.css 1 kB {0} [built]
[3] ./~/css-loader!./src/style.css 420 bytes {0} [built]
[4] ./~/css-loader/lib/css-base.js 2.26 kB {0} [built]
[5] ./src/MyFont.woff 83 bytes {0} [built]
[6] ./~/style-loader/lib/addStyles.js 8.7 kB {0} [built]
[7] ./~/style-loader/lib/urls.js 3.01 kB {0} [built]
[8] (webpack)/buildin/global.js 509 bytes {0} [built]
[9] (webpack)/buildin/module.js 517 bytes {0} [built]
[10] ./src/index.js 503 bytes {0} [built]
重新打開 index.html 看看我們的 Hello webpack 文本顯示是否換上了新的字體,如果一切順利,你應該能看到變化,
加載資料
此外,可以加載的有用資源還有資料,如 JSON 檔案,CSV、TSV 和 XML,類似于 NodeJS,JSON 支持實際上是內置的,也就是說 import Data from './data.json' 默認將正常運行,要匯入 CSV、TSV 和 XML,你可以使用 csv-loader 和 xml-loader,讓我們處理這三類檔案:
npm install --save-dev csv-loader xml-loader
webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
{
test: /\.(png|svg|jpg|gif)$/,
use: [
'file-loader'
]
},
{
test: /\.(woff|woff2|eot|ttf|otf)$/,
use: [
'file-loader'
]
},
+ {
+ test: /\.(csv|tsv)$/,
+ use: [
+ 'csv-loader'
+ ]
+ },
+ {
+ test: /\.xml$/,
+ use: [
+ 'xml-loader'
+ ]
+ }
]
}
};
給你的專案添加一些資料檔案:
project
webpack-demo
|- package.json
|- webpack.config.js
|- /dist
|- bundle.js
|- index.html
|- /src
+ |- data.xml
|- my-font.woff
|- my-font.woff2
|- icon.png
|- style.css
|- index.js
|- /node_modules
src/data.xml
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Mary</to>
<from>John</from>
<heading>Reminder</heading>
<body>Call Cindy on Tuesday</body>
</note>
現在,你可以 import 這四種型別的資料(JSON, CSV, TSV, XML)中的任何一種,所匯入的 Data 變數將包含可直接使用的已決議 JSON:
src/index.js
import _ from 'lodash';
import './style.css';
import Icon from './icon.png';
+ import Data from './data.xml';
function component() {
var element = document.createElement('div');
// Lodash, now imported by this script
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
element.classList.add('hello');
// Add the image to our existing div.
var myIcon = new Image();
myIcon.src = Icon;
element.appendChild(myIcon);
+ console.log(Data);
return element;
}
document.body.appendChild(component());
當你打開 index.html 并查看開發者工具中的控制臺,你應該能夠看到你匯入的資料被列印在了上面!
在使用 d3 等工具來實作某些資料可視化時,預加載資料會非常有用,我們可以不用再發送 ajax 請求,然后于運行時決議資料,而是在構建程序中將其提前載入并打包到模塊中,以便瀏覽器加載模塊后,可以立即從模塊中決議資料,
全域資源
上述所有內容中最出色之處是,以這種方式加載資源,你可以以更直觀的方式將模塊和資源組合在一起,無需依賴于含有全部資源的 /assets 目錄,而是將資源與代碼組合在一起,例如,類似這樣的結構會非常有用:
- |- /assets
+ |– /components
+ | |– /my-component
+ | | |– index.jsx
+ | | |– index.css
+ | | |– icon.svg
+ | | |– img.png
這種配置方式會使你的代碼更具備可移植性,因為現有的統一放置的方式會造成所有資源緊密耦合在一起,假如你想在另一個專案中使用 /my-component,只需將其復制或移動到 /components 目錄下,只要你已經安裝了任何擴展依賴(external dependencies),并且你已經在配置中定義過相同的 loader,那么專案應該能夠良好運行,
但是,假如你無法使用新的開發方式,只能被固定于舊有開發方式,或者你有一些在多個組件(視圖、模板、模塊等)之間共享的資源,你仍然可以將這些資源存盤在公共目錄(base directory)中,甚至配合使用 alias 來使它們更方便 import 匯入,
回退處理
對于接下來的指南,我們無需使用本指南中所有用到的資源,因此我們會進行一些清理作業,以便為下一部分指南中的管理輸出章節做好準備:
project
webpack-demo
|- package.json
|- webpack.config.js
|- /dist
|- bundle.js
|- index.html
|- /src
- |- data.xml
- |- my-font.woff
- |- my-font.woff2
- |- icon.png
- |- style.css
|- index.js
|- /node_modules
webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
- module: {
- rules: [
- {
- test: /\.css$/,
- use: [
- 'style-loader',
- 'css-loader'
- ]
- },
- {
- test: /\.(png|svg|jpg|gif)$/,
- use: [
- 'file-loader'
- ]
- },
- {
- test: /\.(woff|woff2|eot|ttf|otf)$/,
- use: [
- 'file-loader'
- ]
- },
- {
- test: /\.(csv|tsv)$/,
- use: [
- 'csv-loader'
- ]
- },
- {
- test: /\.xml$/,
- use: [
- 'xml-loader'
- ]
- }
- ]
- }
};
src/index.js
import _ from 'lodash';
- import './style.css';
- import Icon from './icon.png';
- import Data from './data.xml';
-
function component() {
var element = document.createElement('div');
-
- // Lodash,現在通過 script 標簽匯入
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
- element.classList.add('hello');
-
- // 將影像添加到我們已有的 div 中,
- var myIcon = new Image();
- myIcon.src = Icon;
-
- element.appendChild(myIcon);
-
- console.log(Data);
return element;
}
document.body.appendChild(component());
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/297308.html
標籤:其他
上一篇:微信小程式入門知識點匯總
下一篇:25歲女前端的成長經歷
