Parcel資源


資源
Parcel 基於資源的。資源可以代表任何文件,但 Parcel 對 JavaScript ,CSS 和 HTML 文件等特定類型的資源有特殊的支援。 Parcel 會自動分析這些檔案中所引用的依賴關係,並將其包含到 輸出套件(output bundle) 中。相似類型的資源被組合在一起成為相同的輸出包。如果您匯入不同類型的資源(例如,如果你在 JS 中匯入了一個 CSS 檔案),它會新建一個子包,並在父級中保留一個引用。這將在下面的部分中進行舉例說明。
JavaScript
Web 打包器(bundler) 最傳統的檔案類型是 JavaScript 。 Parcel 支援 CommonJS 和 ES6 模組語法來匯入檔案。它還支援動態 import() 函數語法來非同步載入模組,這在 程式碼拆分 部分討論。

// 使用 CommonJS 语法导入模块
const dep = require('./path/to/dep');
// 使用 ES6 import 语法导入模块
import dep from './path/to/dep';

你也可以在 JavaScript 檔案匯入非 JavaScript 資源, 例如 CSS ,甚至是圖片檔案。當您匯入其中一個檔案時,它不像其他一些 打包器(bundler) 一樣內聯的。相反,它及其所有依賴項被放置在一個單獨的套件(bundle)(例如一個 CSS 檔案)中。當使用 CSS Modules 時,導出的類別被放置在 JavaScript 套件中。其他資源類型會將一個 URL 匯出到 JavaScript 套件的輸出檔案中,所以你可以在你的程式碼中引用它們。

// 导入一个 CSS 文件
import './test.css';
// 通过 CSS modules 导入一个 CSS 文件
import classNames from './test.css';
// 通过URL 导入一个 image 文件 
import imageURL from './test.png';

如果你想將檔案內聯到 JavaScript 套件中,而不是透過 URL 引用,你可以使用 Node.js 中的 fs.readFileSync API 來做到這一點。 URL 必須是靜態可分析的,這意味著它不能有任何變數(除了 __dirname 和 __filename )。

import fs from 'fs';
// 以字符串形式读取内容 
const string = fs.readFileSync(__dirname + '/test.txt', 'utf8');
// 以 缓冲区(Buffer)形式读取内容
const buffer = fs.readFileSync(__dirname + '/test.png');

CSS
CSS 資源可以在JavaScript 或HTML 檔案匯入,並且可以透過@import 語法包含引用的依賴關係,以及透過url() 函數引用圖像,字體等。其他的 @import 的 CSS 檔案被內聯到同一個 CSS 套件中,並且 url() 引用被重寫為它們的輸出檔案名稱。所有的檔案名稱應該是相對於目前的 CSS 檔案。

/* 导入另一个 CSS 文件 */
@import './other.css';
.test {
  /* 引用一个 image 文件 */
  background: url('./images/background.png');
}

除了純 CSS ,還支援其他編譯成 CSS 語言,如 LESS ,SASS 和 Stylus ,並以相同的方式運作。
SCSS
SCSS編譯需要 node-sass 模組。可以用 npm 來安裝它:

npm install node-sass

一旦 node-sass 安裝完成,你就可以在 JavaScript 檔案中匯入 SCSS 檔案。

import './custom.scss'

SCSS 檔案中的依賴可以使用 @import 語句。
HTML
HTML 資源通常是你提供給 Parcel 的入口文件,但也可以被 JavaScript 文件引用,例如,提供其他網頁的連結。腳本,樣式,媒體和其他 HTML 檔案的 URL 被提取和編譯,如上所述。引用被重寫到 HTML 中,以便它們連結到正確的輸出檔案。所有的檔案名稱應該是相對於目前的 HTML 檔案。

<html>
<body>
  <!-- 引用一个 image 文件 -->
  <img src="./images/header.png">
  <a href="./other.html">Link to another page</a>
  <!-- 导入一个 JavaScript 包 -->
  <script src="./index.js"></script>
</body>
</html>