写点什么

我为何放弃 Gulp 与 Grunt,转投 npm scripts(中)

  • 2016-02-23
  • 本文字数:3011 字

    阅读完需:约 10 分钟

Cory House 是“ Building Applications with React and Flux ”与“ Clean Code: Writing Code for Humans ”的作者,同时也是 Pluralsight 上众多课程的讲师。他是 VinSolutions 的软件架构师,在全球培训了为数众多的软件开发者,主要领域是前端开发与整洁代码等软件开发实践。Cory 是微软MVP、Telerik 开发者专家,同时也是 outlierdeveloper.com 的创始人。目前,围绕着 Gulp、Grunt 及 npm scripts 社区展开了很多争论,讨论 Gulp 与 Grunt 在项目中是否还有继续使用的必要。有人坚持认为 Gulp 与 Grunt 等前端构建工具依然是不可或缺的,还有些人则认为 Gulp 与 Grunt 是完全没必要使用的,而且还增加了一层抽象,会导致很多问题。近日,Cory撰文谈到了他对于 Gulp、Grunt 与 npm scripts 的认识,并且认为在现在的工程中,我们完全可以抛弃 Gulp 与 Grunt,使用 npm scripts 就可以满足项目之所需。

在本系列的上一篇文章中,我们谈到了诸如 Gulp 与 Grunt 等任务运行器所存在的问题,接下来就来谈谈 npm scripts 的强大功能以及人们为何会忽略 npm scripts。

在构建时我们为何会忽略掉 npm?

我认为有如下 4 点原因造成 Gulp 与 Grunt 等任务运行器变得如此流行:

  • 人们认为 npm scripts 需要强大的命令行技巧
  • 人们认为 npm scripts 不够强大
  • 人们认为 Gulp 的流对于快速构建来说是不可或缺的
  • 人们认为 npm scripts 无法实现跨平台运行

下面我就来按照顺序解释一下这些误解。

误解 1:使用 npm scripts 需要强大的命令行技巧

体验 npm scripts 的强大功能其实并不需要对操作系统的命令行了解太多。当然了, grep、sed、awk 与管道等是值得你去学习的,令你众生受用的技能;不过,为了使用 npm scripts,你不必非得成为 Unix 或是 Windows 命令行专家才行。你可以通过 npm 中 1000 多个拥有良好文档的脚本来完成工作。

比如说,你可能不知道在 Unix 中,命令 rm -rf 会强制删除一个目录,这没问题。你可以使用 rimraf 完成同样的事情(它也是跨平台的)。大多数 npm 包都提供了一些接口,这些接口假设你对所用操作系统的命令行了解不多。只需在 npm 中搜索想要使用的包即可,边做边学就行了。过去,我常常会搜索 Gulp 插件,不过现在则是搜索 npm 包了。 libraries.io 是个非常棒的资源。

误解 2:npm scripts 不够强大

npm scripts 本身其实是非常强大的。它提供了基于约定的 pre 与 post 钩子

复制代码
{
name: "npm-scripts-example",
version: "1.0.0",
description: "npm scripts example",
scripts: {
prebuild: "echo I run before the build script",
build: "cross-env NODE_ENV=production webpack",
postbuild: "echo I run after the build script"
}
}

你所要做的就是遵循约定。上述脚本会根据其前缀按照顺序运行。prebuild 脚本会在 build 脚本之前运行,因为他们的名字相同,但 prebuild 脚本有“pre”前缀。postbuild 脚本会在 build 脚本之后运行,因为它有“post”前缀。因此,如果创建了名为 prebuild、build 与 postbuild 的脚本,那么在我输入“npm run build”时,他们就会自动按照这个顺序运行。

此外,还可以通过在一个脚本中调用另一个脚本来对大的问题进行分解:

复制代码
{
"name": "npm-scripts-example",
"version": "1.0.0",
"description": "npm scripts example",
"scripts": {
"clean": "rimraf ./dist && mkdir dist",
"prebuild": "npm run clean",
"build": "cross-env NODE_ENV=production webpack"
}
}

在上述示例中,prebuild 任务调用了 clean 任务。这样就可以将脚本分解为更小、命名良好、单职责,单行的脚本。

可以通过 && 在一行连续调用多个脚本。上述示例中,clean 步骤中的脚本会一个接着一个运行。如果你需要在 Gulp 中按照顺序一个接着一个地运行任务列表中的任务,那么这种简洁性肯定会吸引到你。

如果一个命令很复杂,那还可以调用一个单独的文件:

复制代码
{
"name": "npm-scripts-example",
"version": "1.0.0",
"description": "npm scripts example",
"scripts": {
"build": "node build.js"
}
}

我在上述的 build 任务中调用了一个单独的脚本。该脚本会被 Node 所运行,这样就可以使用我所需的任何 npm 包了,同时还可以利用上 JavaScript 的能力。我还能列出很多,不过感兴趣的读者可以参考这份核心特性文档。此外,Pluralsight 上也有一门关于如何将npm 作为构建工具的课程。还可以看看 React Slingshot 以直观了解其使用方式。

误解 3:Gulp 的流对于快速构建来说是不可或缺的

Gulp 出来后,人们之所以很快就被它吸引过去并放弃 Grunt 的原因在于 Gulp 的内存流要比 Grunt 基于文件的方式快很多。不过,要想享受到流的强大功能,实际上并不需要 Gulp。事实上,流早就已经被内建到 Unix 与 Windows 命令行中了。管道(|)运算符会将一个命令的输出以流的方式作为另一个命令的输入。重定向(>)运算符则会将输出重定向到文件。比如说在 Unix 中,我可以“grep”一个文件的内容,并将输出重定向到一个新的文件:

复制代码
grepCory HousebigFile.txt > linesThatHaveMyName.txt

上述过程是流式的,并不会被写入到中间文件中(想知道如何以跨平台的方式实现上面的命令么?请继续往下读)。

在 Unix 中,还可以通过“&”运算符同时运行两个命令:

复制代码
npm run script1.js & npm run script2.js

上述两个脚本会同时运行。要想以跨平台的方式同时运行脚本,请使用 npm-run-all 。这就造成了下面这个误解。

误解 4:npm scripts 无法实现跨平台运行

很多项目都会绑定到特定的操作系统上,因此跨平台是一件并不那么重要的事情。不过,如果需要以跨平台的方式运行,那么 npm scripts 依然可以工作得很好。无数的开源项目就是佐证。下面来介绍一下实现方式。

操作系统的命令行会运行你的 npm scripts。因此,在 Linux 与 OS X 上,npm scripts 会在 Unix 命令行中运行。在 Windows 上,npm scripts 则运行在 Windows 命令行中。这样,如果希望构建脚本能够运行在所有平台上,你需要适配 Unix 与 Windows。下面介绍 3 种实现方式:

方式 1:使用跨平台的命令

有很多跨平台的命令可供我们使用。下面列举一些:

复制代码
&& 链式任务(一个任务接着一个任务运行)
< 将文件内容输入到一个命令
> 将命令输出重定向到文件
| 将一个命令的输出重定向到另一个命令

方式 2:使用 node 包

可以使用 node 包来代替 shell 命令。比如说,使用 rimraf 来代替“rm -rf`”。使用 cross-env 以跨平台的方式设置环境变量。搜索 Google、npm 或是 libraries.io ,寻找你所需要的,几乎都会有相应的 node 包以跨平台的方式实现你的目标。如果命令行调用过长,你可以在单独的脚本中调用 Node 包,就像下面这样:

复制代码
node scriptName.js

上述脚本就是普通的 JavaScript,由 Node 运行。既然是在命令行调用了脚本,那么你就不会受限于.js 文件。你可以运行操作系统所能执行的任何脚本,比如说 Bash、Python、Ruby 或是 Powershell 等等。

方式 3:使用 ShellJS

ShellJS 是个通过 Node 来运行 Unix 命令的 npm 包。这样就可以通过它在所有平台上运行 Unix 命令了,也包括 Windows。

我在 React Slingshot 上同时使用了方式 1 与 2。

本文主要介绍了人们对于 npm scripts 存在的误解,以及 npm scripts 自身所提供的强大功能。借助于操作系统提供的各种基础设施、npm scripts 以及各种命令,我们完全可以通过 npm scripts 以更加轻量级的方式实现 Gulp 与 Grunt 等任务运行器所提供的功能。

本系列的下一篇文章将会介绍 npm scripts 中存在的一些痛点以及应对之道。

2016-02-23 07:147295
用户头像

发布了 88 篇内容, 共 263.1 次阅读, 收获喜欢 8 次。

关注

评论 2 条评论

发布
暂无评论
发现更多内容

每周更新 | Verilog测试用例及波形展示图功能上线

ShowMeBug

再论ORACLE上云通用技术方案

天翼云开发者社区

芝士就是力量!蒙牛2021年报笑出大大的CHEESE

科技新消息

61%!产品+渠道创新 蒙牛冰淇淋业绩收录有史高增长

科技新消息

java培训浅谈程序员怎么避免面试过程中碰壁

@零度

面试 JAVA开发

专属云资源包计算规格探秘

天翼云开发者社区

自动化运维发展趋势以及好用工具推荐

行云管家

运维 IT运维 自动化运维

蒙牛2021年报:数智化大脑为乳业插上腾飞翅膀

科技新消息

PolarDB-X 正式发布2.1.0版本,Paxos 重磅开源

阿里云数据库开源

数据库 阿里云 开源 分布式 PolarDB-X

打造中国优质奶源基地 筑牢高质量发展基石

科技新消息

星环科技TDH基于Overlay网络架构为数据安全保驾护航

星环科技

数据库

制造业企业数据平台建设最佳实践分享

华为云开发者联盟

数字化转型 数据平台 制造业 华为工业云平台 数据应用

天翼云新一代V5云主机,Kvm之生,Xen之死!

天翼云开发者社区

天翼云分布式缓存服务(Redis)的几个核心概念

天翼云开发者社区

整机生产制造头部厂商雷神科技加入龙蜥社区

OpenAnolis小助手

Linux 开源 整机

把一整个生态圈藏进大沙漠 看蒙牛如何在每一滴奶中藏进玄机

科技新消息

夯实领军者地位 奶酪业务协同发展领先赛道

科技新消息

设计消息队列存储消息数据的 MySQL 表格

唐尤华

架构实战营

使用 Amazon Cloud WAN 构建您的全球网络

亚马逊云科技 (Amazon Web Services)

Builder 专栏

“敏捷项目比传统项目快”这个说法对吗?

优秀

项目管理 低代码开发

Linux 管道操作符详解

CRMEB

领域驱动设计入门与实践[下]

LigaAI

团队管理 DDD 领域驱动设计思想 LigaAI

人工智能融合赋能平台,赋能智慧城市智能化升级

脑极体

墨天轮访谈 | 腾讯张铭:带你揭秘王者荣耀背后的游戏数据库 TcaplusDB

墨天轮

数据库 TcaplusDB 国产数据库

易观分析:海外业务亮眼,研发+IP运营助力中手游持续增长

易观分析

IP 中手游

教你三步实现CDH到星环TDH的平滑迁移

星环科技

国产数据库

天翼云分布式缓存服务(Redis)的应用场景(干货)

天翼云开发者社区

爆款国民冰淇淋原来是这样“凝冻”出来的

科技新消息

TypeScript 之 any:哪里可以用?哪里不能用?

杨成功

4月月更

龙蜥社区&龙蜥开发者获CSDN 2021年度技术影响力「年度开源项目」奖和「年度社区之星」

OpenAnolis小助手

开发者 开源项目 龙蜥社区 年度影响力 社区之星

【网络安全】网络安全堡垒机多少钱?有什么用?

行云管家

网络安全 信息安全 数据安全 堡垒机 企业安全

我为何放弃Gulp与Grunt,转投npm scripts(中)_语言 & 开发_张龙_InfoQ精选文章