为什么 Parcel 成为我的首选开发打包工具

Avatar of Maks Akymenko
Maks Akymenko

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 $200 免费额度!

今天我们要谈论应用程序打包器 - 这些工具简化了我们作为开发人员的生活。 它们的核心是将来自多个文件的代码提取并整合到一个或多个文件中,按照逻辑顺序进行编译,以便在浏览器中使用。 此外,通过不同的插件和加载器,您可以压缩代码、打包其他类型的资产(如 CSS 和图像)、使用预处理器、代码分割等。 它们管理开发工作流程。

市面上有很多打包器,例如 Browserifywebpack。 虽然这些都是很好的选择,但我个人发现它们很难设置。 您从哪里开始? 这对于初学者来说尤其如此,因为“配置文件”可能有点吓人。

这就是我倾向于使用 Parcel 的原因。 我是在 YouTube 上观看教程时偶然发现它的。 演讲者谈论了加速开发的技巧,他强烈依赖 Parcel 作为其工作流程的一部分。 我决定自己尝试一下。

Parcel 的独特之处

我最喜欢这个打包器的地方:**它不需要任何配置。** 从字面上看,一点也不! 将其与 webpack 相比较,webpack 的配置可能散布在多个文件中,所有文件都包含大量代码……这些代码可能来自其他人的配置或从其他项目继承而来。 当然,配置的复杂程度取决于您的设置,但即使是最简单的工作流程也需要一组插件和选项。

我们都使用不同的工具来简化工作。 有些工具例如预处理器、后处理器、编译器、转译器等。 设置这些工具需要时间,而且通常需要相当长的时间。 您是否宁愿将这些时间用于开发?

这就是 Parcel 似乎是一个良好解决方案的原因。 您想用 SCSS 或 LESS 编写样式吗? 做吧! 您想使用最新的 JavaScript 语法吗? 包含在内。 需要开发服务器吗? 搞定。 这仅仅触及了 它支持的大量其他功能列表的表面

Parcel 允许您简单地开始开发。 这是使用它作为打包器的最大优势 - 以及它闪电般的快速编译速度,该速度利用多核处理,而其他打包器(包括 webpack)则依赖于复杂而繁重的转换。

使用 Parcel 合适的场景

Parcel 与任何工具一样,并非万能药,不能作为所有事物的通用解决方案。 它有一些最适合使用的场景。

我已经提到过它启动项目的快速速度。 这使得它非常适合处理时间宝贵且目标是尽快在浏览器中显示结果的紧迫截止日期和原型。

这并不意味着它无法胜任处理复杂的应用程序或许多开发人员可能触及代码的项目。 它非常有能力做到这一点。 但是,我意识到这些项目可能非常受益于手工定制的工作流程。

这有点像自动变速箱和手动变速箱汽车之间的区别。 有时您需要额外的控制,有时您不需要。

我一直致力于开发一个包含大量 JavaScript 代码的商业多页面网站,Parcel 对我来说非常有效。 它提供了我的服务器,它将我的 Sass 编译为 CSS,它在需要时添加供应商前缀,它允许我在 JavaScript 文件中开箱即用地使用导入和导出,无需任何配置。 所有这一切使我可以轻松地启动并运行我的项目。

让我们一起使用 Parcel 创建一个简单的网站

让我们试用 Parcel,看看用它创建东西有多简单。

我们将构建一个简单的页面,使用 Sass 和少量 JavaScript。 我们将获取当前一周的日期和来自 Unsplash Source 的随机图像。

基本结构

我们不需要使用任何脚手架或框架来初始化项目。 相反,我们将创建三个文件,这些文件应该看起来非常熟悉:index.htmlstyle.scssindex.js。 您可以在终端中手动设置它们

mkdir simple-site
cd simple-site
touch index.html && touch style.scss && touch index.js

让我们将一些样板标记和基本轮廓添加到 HTML 文件中

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <link href="https://fonts.googleapis.com/css?family=Lato&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="style.scss">
  <title>Parcel Tutorial</title>
</head>
<body>
  <div class="container">
    <h1>Today is:</h1>
    <span class="today"></span>
    <h2>and the image of the day:</h2>
    <img src="https://source.unsplash.com/random/600x400" alt="unsplash random image">
</div>
<script src="index.js"></script>
</body>
</html>

您可能已经注意到,我从 Google 中引入了一个网络字体(Lato),这是完全可选的。 否则,我们所做的就是链接 CSS 和 JavaScript 文件,并添加基本的 HTML,它将显示一周的日期和来自 Unsplash 的链接,该链接将提供随机图像。 这是我们基线真正需要的全部。

感受 Parcel 的快速设置!

在我们深入研究样式和脚本之前,让我们使用 Parcel 作为打包器运行应用程序。 安装 Parcel 与任何东西一样

npm install -g parcel-bundler
# or
yarn global add parcel-bundler

我们也创建一个 package.json 文件,以防我们需要任何开发依赖项。 这里也是 Parcel 将包含开箱即用工作所需的一切。

npm init -y
# or
yarn init -y

就这样! 不再需要配置! 我们只需要告诉 Parcel 项目的入口文件是哪个,这样它就知道将服务器指向哪里。 我们的 HTML 文件将是入口文件

parcel index.html

如果我们打开控制台,我们将看到类似这样的内容,表明服务器已在运行

Server running at https://127.0.0.1:1234

Parcel 的服务器支持热重载,并在保存更改时重建应用程序。

现在,回到我们的项目文件夹,我们将看到 Parcel 为我们创建的额外内容

对我们来说,重要的是 dist 文件夹,它包含我们所有编译后的代码,包括 CSS 和 JavaScript 的源代码映射。

现在我们只需构建!

让我们进入 style.scss,看看 Parcel 如何处理 Sass。 我创建了变量来存储一些颜色和包含我们内容的容器的宽度

$container-size: 768px;
$bg: #000;
$text: #fff;
$primary-yellow: #f9f929;

现在进行一些样式设置,包括一些嵌套的规则集。 您当然可以做自己的事情,但为了演示目的,我制作了以下内容

*, *::after, *::before {
  box-sizing: border-box;
}

body {
  background: $bg;
  color: $text;
  font-family: 'Lato', sans-serif;
  margin: 0;
  padding: 0;
}

.container {
  margin: 0 auto;
  max-width: $container-size;
  text-align: center;

  h1 {
    display: inline-block;
    font-size: 36px;
  }

  span {
    color: $primary-yellow;
    font-size: 36px;
    margin-left: 10px;
  }
}

保存后,Parcel 的魔法就会触发,所有内容都会编译并在浏览器中重新加载。 不需要任何命令,因为它已经在监视文件以进行更改。

到目前为止,我们已经有了这些

Webpage with black background, a heading and an image

唯一剩下的就是显示一周的当前日期。 我们将使用 导入导出,这样我们就可以看到 Parcel 如何让我们使用现代 JavaScript。

让我们创建一个名为 today.js 的文件,并包含一个函数,该函数从日期数组中报告当前一周的日期

export function getDay() {
  const today = new Date();
  const daysArr = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
  return daysArr[today.getDay()];
}

💡 值得注意的是,getDay 函数将星期日作为一周的第一天。

请注意,我们正在导出 getDay 函数。 让我们进入 index.js 文件并将其导入到那里,以便在编译发生时将其包含在内

import { getDay } from './today';

我们可以导入/导出文件,因为 Parcel 开箱即用地支持 ES6 模块语法 - 重申一遍,不需要任何配置!

唯一剩下的就是选择 <span> 元素并将 getDay 函数的值传递给它

const day = document.querySelector('.today');
day.innerHTML = getDay();

让我们看看最终结果

Webpage with black background, heading that includes the day of the week, and an image below.

最后一步是构建生产环境

我们已经创建了应用程序,但我们希望将其部署到某个地方——无论是你的个人服务器,还是一些零配置部署工具,例如 SurgeNow——而且我们希望部署编译和压缩后的代码。

下面是唯一需要执行的命令

parcel build index.js
Terminal output after a successful build.

这将为我们提供应用程序的所有生产就绪的资产。你可以 阅读更多关于 Parcel 的生产模式,以获得一些提示和技巧,以充分利用你的环境。


我已经说过很多次了,并且再次重申:Parcel 是一个很棒的工具。它可以捆绑、编译、部署、预处理和后处理、压缩和混淆等等。我们可能只看了一个非常简单的例子,但希望你现在对 Parcel 提供的功能以及如何在自己的项目中开始使用它有了很好的了解。

我很想知道你是否已经在使用 Parcel,如果是,你如何使用它。你是否发现它在某些方面比其他方面更有效?你是否发现了一些使它更强大的巧妙技巧?请在评论区告诉我!