更優(yōu)雅的使用 Parcel 進(jìn)行前端項(xiàng)目的打包

Parcel 有著開(kāi)箱即用的特性, 為我們初始化工程省卻了許多時(shí)間, 但是零配置的特性導(dǎo)致我們比較不方便進(jìn)行一些預(yù)處理, 這篇文章就帶領(lǐng)讀者解決一些我們常會(huì)遇到的一些問(wèn)題. 只需要很簡(jiǎn)單的添加幾個(gè)參數(shù),就可以滿足我們大部分的特殊情況.

在去年, Parcel 沒(méi)有支持 SourceMap 的特性, 導(dǎo)致于無(wú)法進(jìn)行斷點(diǎn)調(diào)試, 從而很多團(tuán)隊(duì)沒(méi)有在生產(chǎn)中使用 Parcel, 現(xiàn)在 Parcel 已經(jīng)支持 SourceMap 的特性, 再加上可以很方便的編寫(xiě)插件去填補(bǔ)一些自定義的功能, 所以 Parcel 我認(rèn)為已經(jīng)可以在新項(xiàng)目的生產(chǎn)中投入使用了.

本文作者簡(jiǎn)單的編寫(xiě)了一個(gè) parcel-plugin-change-file 插件示例, 來(lái)滿足下面的功能, 具體使用請(qǐng)繼續(xù)閱讀文章內(nèi)容.

本文不會(huì)對(duì) Parcel 的基礎(chǔ)使用再多做解釋, 如果您還沒(méi)有接觸過(guò) Parcel ,請(qǐng)先去了解: Parcel 官方文檔-快速開(kāi)始

如何跳過(guò)不需要打包的文件?

如果我們使用 parcel index.html 命令, Parcel 會(huì)自動(dòng)識(shí)別html中的引用,如果是http://就不會(huì)進(jìn)行打包處理, 如果是本地文件,就會(huì)識(shí)別成Assets對(duì)象,進(jìn)行打包.

如果我們需要跳過(guò)對(duì)本地文件的打包, 我們可以使用 parcel-plugin-change-file 插件

$ yarn add -D parcel-plugin-change-file

在 index.html中添加 `` , 注意這里有兩個(gè)中括號(hào).

<body>
  <!--[ <script src="lodash.min.js"></script> ]-->
</bodt>

當(dāng)項(xiàng)目編譯結(jié)束之后, 該插件會(huì)把 `` 的注釋內(nèi)容打開(kāi),從而跳過(guò) Parcel 的打包檢測(cè).

<body>
  <script src="lodash.min.js"></script>
</bodt>

如何對(duì)html進(jìn)行修改?

例如, 我們嘗試根據(jù) package.json 中的信息修改 index.htmltitle

在項(xiàng)目跟路徑創(chuàng)建 parcel-plugin-change-file.js 文件

const package = require('./package.json')
module.exports = {
  html: [package.name],
};

src/index.html 中添加 `` , 其中 i 對(duì)應(yīng)之前 html 對(duì)象中的數(shù)組下標(biāo), 這里我們只有一個(gè), 所以用 0

<header>
  <title><!-- parcel-plugin-change-file-0 --></title>
</header>

當(dāng)項(xiàng)目編譯結(jié)束之后, 該插件會(huì)把 package.json 中的 name 信息插入到 title

<body>
  <title>Parcel優(yōu)雅配置</title>
</bodt>

如何在parcel打包結(jié)束之后拷貝一些文件到打包目錄?

例如, 某些情況, 我們不需要 Parcel 幫我們處理 png 圖片, 我們希望直接使用圖片路徑:

class Banner extends React.Componet {
  render(){
    return <div style={{
      backgoundImage:'img/test.png'
    }} ></div>
  }
}

那我們就需要在打包之后再把圖片拷貝到相應(yīng)的路徑.

還是確保parcel-plugin-change-file 已被安裝, 然后在項(xiàng)目跟路徑創(chuàng)建parcel-plugin-change-file.js

module.exports = {
  copy: ['src/assets', 'src/documents'],
};

正常執(zhí)行 Parcel 打包腳本, 就會(huì)把 src/assetssrc/documents子內(nèi)容拷貝到打包輸出的跟路徑

$ parcel src/index.html

如何達(dá)到和 webpack.DllPlugin 一樣的預(yù)先編譯的效果呢?

Webpack 的 DllPlugin 插件可以把一些不常進(jìn)行修改的庫(kù)提前編譯成一個(gè)文件, 然后在項(xiàng)目里引用, 經(jīng)過(guò)配置webpack不會(huì)再次編譯這些已經(jīng)編譯過(guò)的文件.這樣可以大大的加速平時(shí)編譯的時(shí)間. 從而趕上 Parcel 的打包速度.

而在 Parcel 中,也可以可以把一些不常進(jìn)行修改的庫(kù)提前編譯成一個(gè)文件, 這樣可以在 Parcel 原本就快速的編譯前提下再減去絕大部分的編譯內(nèi)容, 從而極大的加速平時(shí)編譯的時(shí)間, 不過(guò)就只能使用全局對(duì)象引用了.

在Parcel項(xiàng)目中, 是可以使用全局對(duì)象的, 例如我們?cè)趆tml中引入一個(gè)lodash:

<body>
    <script src="https://cdn.bootcss.com/lodash.js/4.17.9/lodash.min.js"></script>
</body>

此時(shí), 在項(xiàng)目中不需要import _ from 'lodash', 可以識(shí)別全局_對(duì)象的

console.log(_.map)  //可以打印出 _.map 方法

有了以上知識(shí)點(diǎn),我們可以這樣做:

  1. 創(chuàng)建一個(gè)預(yù)先需要打包的文件:
// dll/default.js
// 假設(shè)這些庫(kù)是自己編寫(xiě)的庫(kù), 需要在預(yù)編譯, 并且在全局引用
import _ from 'lodash';
import Immutable from 'immutable';

// 暴露到全局對(duì)象中
window['_'] = _;
window['Immutable'] = Immutable;

  1. 使用Parcel進(jìn)行打包, 其中changeFile=false 是不使用 parcel-plugin-change-file 插件:
$ changeFile=false parcel build dll/default.js -d src/dll -o defalut.min.js

以上 default.min.js 已經(jīng)創(chuàng)建好了, 接下來(lái)是在平時(shí) Parcel 的項(xiàng)目中使用它

  1. 我們需要在 src/index.html 里引入 src/dll/default.min.js
<head>
    <!--[ <script src="default.min.js"></script> ]-->
</head>
  1. 創(chuàng)建parcel-plugin-change-file.js
module.exports = {
  copy: ['src/dll'],
};
  1. 大功告成,可以在項(xiàng)目里直接使用之前 default.min.js 中暴露在 window 下的全局對(duì)象
// src/index.js
_.map(_.range(500), v=>{
  console.log(`hello:${v}`);
})
  1. 如果需要有提示, 需要編寫(xiě) .d.ts 文件, 然后在項(xiàng)目中引入

這一塊知識(shí)點(diǎn)請(qǐng)查閱 typescript Declaration Files 文檔

/// <reference path="./your-edit.d.ts"/>

啟動(dòng)項(xiàng)目:

$ parcel src/index.html

最后, 如果這篇文章有幫到你, 歡迎 Star: parcel-plugin-change-file

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評(píng)論 25 708
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,286評(píng)論 6 342
  • 桌上有十個(gè)蘋(píng)果,要把這十個(gè)蘋(píng)果放到九個(gè)抽屜里,無(wú)論怎樣放,我們會(huì)發(fā)現(xiàn)至少會(huì)有一個(gè)抽屜里面至少放兩個(gè)蘋(píng)果。這一現(xiàn)象就...
    張老師大語(yǔ)文閱讀 2,641評(píng)論 0 0
  • 簡(jiǎn)悅直播教練恬源閱讀 199評(píng)論 0 2

友情鏈接更多精彩內(nèi)容