更优雅的使用 Parcel 进行前端项目的打包

Parcel 有着开箱即用的特性, 为我们初始化工程省却了许多时间, 但是零配置的特性导致我们比较不方便进行一些预处理, 这篇文章就带领读者解决一些我们常会遇到的一些问题. 只需要很简单的添加几个参数,就可以满足我们大部分的特殊情况.

在去年, Parcel 没有支持 SourceMap 的特性, 导致于无法进行断点调试, 从而很多团队没有在生产中使用 Parcel, 现在 Parcel 已经支持 SourceMap 的特性, 再加上可以很方便的编写插件去填补一些自定义的功能, 所以 Parcel 我认为已经可以在新项目的生产中投入使用了.

本文作者简单的编写了一个 parcel-plugin-change-file 插件示例, 来满足下面的功能, 具体使用请继续阅读文章内容.

本文不会对 Parcel 的基础使用再多做解释, 如果您还没有接触过 Parcel ,请先去了解: Parcel 官方文档-快速开始

如何跳过不需要打包的文件?

如果我们使用 parcel index.html 命令, Parcel 会自动识别html中的引用,如果是http://就不会进行打包处理, 如果是本地文件,就会识别成Assets对象,进行打包.

如果我们需要跳过对本地文件的打包, 我们可以使用 parcel-plugin-change-file 插件

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

在 index.html中添加 `` , 注意这里有两个中括号.

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

当项目编译结束之后, 该插件会把 `` 的注释内容打开,从而跳过 Parcel 的打包检测.

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

如何对html进行修改?

例如, 我们尝试根据 package.json 中的信息修改 index.htmltitle

在项目跟路径创建 parcel-plugin-change-file.js 文件

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

src/index.html 中添加 `` , 其中 i 对应之前 html 对象中的数组下标, 这里我们只有一个, 所以用 0

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

当项目编译结束之后, 该插件会把 package.json 中的 name 信息插入到 title

<body>
  <title>Parcel优雅配置</title>
</bodt>

如何在parcel打包结束之后拷贝一些文件到打包目录?

例如, 某些情况, 我们不需要 Parcel 帮我们处理 png 图片, 我们希望直接使用图片路径:

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

那我们就需要在打包之后再把图片拷贝到相应的路径.

还是确保parcel-plugin-change-file 已被安装, 然后在项目跟路径创建parcel-plugin-change-file.js

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

正常执行 Parcel 打包脚本, 就会把 src/assetssrc/documents子内容拷贝到打包输出的跟路径

$ parcel src/index.html

如何达到和 webpack.DllPlugin 一样的预先编译的效果呢?

Webpack 的 DllPlugin 插件可以把一些不常进行修改的库提前编译成一个文件, 然后在项目里引用, 经过配置webpack不会再次编译这些已经编译过的文件.这样可以大大的加速平时编译的时间. 从而赶上 Parcel 的打包速度.

而在 Parcel 中,也可以可以把一些不常进行修改的库提前编译成一个文件, 这样可以在 Parcel 原本就快速的编译前提下再减去绝大部分的编译内容, 从而极大的加速平时编译的时间, 不过就只能使用全局对象引用了.

在Parcel项目中, 是可以使用全局对象的, 例如我们在html中引入一个lodash:

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

此时, 在项目中不需要import _ from 'lodash', 可以识别全局_对象的

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

有了以上知识点,我们可以这样做:

  1. 创建一个预先需要打包的文件:
// dll/default.js
// 假设这些库是自己编写的库, 需要在预编译, 并且在全局引用
import _ from 'lodash';
import Immutable from 'immutable';

// 暴露到全局对象中
window['_'] = _;
window['Immutable'] = Immutable;

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

以上 default.min.js 已经创建好了, 接下来是在平时 Parcel 的项目中使用它

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

这一块知识点请查阅 typescript Declaration Files 文档

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

启动项目:

$ parcel src/index.html

最后, 如果这篇文章有帮到你, 欢迎 Star: parcel-plugin-change-file

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,384评论 25 707
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,724评论 6 342
  • 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就...
    张老师大语文阅读 2,159评论 0 0
  • 简悦直播教练恬源阅读 170评论 0 2