写点什么

我为何放弃 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:147346
用户头像

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

关注

评论 2 条评论

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

宇宙级计算机大佬吐血整理出2224页计算机系统文档(离线版)

Java~~~

Java 架构 面试 TCP 操作系统

低代码是什么?

低代码小观

低代码 低代码开发平台

无代码是什么?

低代码小观

无代码开发 无代码 无代码平台

架构实战训练营模块六作业

Clarke

fil挖矿步骤教程是什么?fil挖矿规则是什么?

fil挖矿步骤教程是什么 fil挖矿规则是什么

MySQL到ClickHouse的高速公路-MaterializeMySQL引擎

华为云数据库小助手

sql GaussDB dba 华为云数据库 DAS

爆料!前华为微服务专家纯手打500页落地架构实战笔记,已开源

Java~~~

Java spring 架构 面试 微服务

燃炸!字节跳动成功上岸,只因刷爆LeetCode算法面试题

Java~~~

Java 架构 面试 算法 LeetCode

安卓主板RK3288 RK3128 RK3399有哪些特点?

双赞工控

安卓主板 rk3288主板 rk3399主板 rk3128主板

云时代,用对工具就能让云上运维工作事半功倍!

行云管家

云计算 云服务 混合云 云时代 云运维

华为3位大咖吐血整理出600多页Spring微服务架构设计

Java~~~

Java spring 架构 面试 微服务

如何做好Clickhouse集群的监控覆盖?

BUG侦探

大数据 Clickhouse 监控系统

IM技术分享:万人群聊消息投递方案的思考和实践

JackJiang

即时通讯 IM 群聊

接口管理进阶-环境变量的使用

CodeNongXiaoW

大前端 测试 后端 接口文档 接口管理

重磅升级!融云推出 IM+RTC+X「全」通信解决方案

融云 RongCloud

开发者 音视频 通信 即时通讯

脱钩!打工人都觉得香的Java程序员306道面试秘笈,爆肝

Java~~~

Java spring 架构 面试 微服务

Python代码阅读(第22篇):从源字典映射出新字典

Felix

Python 编程 Code Programing 阅读代码

InfoQ引航计划|合集排版规范

InfoQ写作社区官方

引航计划

Paxos理论介绍(1): 朴素Paxos算法理论推导与证明

OpenIM

ipfs挖矿用什么app?ipfs挖矿收益计算器怎么看?

ipfs挖矿用什么app ipfs挖矿收益计算器怎么看

阿里五位大佬总结操作系统+程序员必知硬核知识离线版pdf火了

Java~~~

Java 架构 面试 操作系统 网络

信息安全等级保护四级常见问题解答

行云管家

网络安全 信息安全 堡垒机 等级保护

前阿里P8狂总结出1000页Java面试核心原理+框架篇笔记

Java~~~

Java spring 架构 面试 微服务

一上来就主从、集群、哨兵,这谁受得了

阿Q说代码

redis 命令 8月日更 五大基础类型

漫游语音识别技术——带你走进语音识别技术的世界

声网

语音识别

百度智能云天工物联网支持多种类数据传输!MQTT助力数据、语音、视觉应用智能化

百度开发者中心

产品 最佳实践 前沿技术 企业资讯

卧 底 人 类 高 质 量 A I 公 司

白洞计划

牛皮了!华为世界顶级Linux大牛总结出了3788页进阶笔记

Java~~~

Java Linux 架构 面试 运维

InfoQ引航计划|文章排版规范

InfoQ写作社区官方

熟悉Linux tail 命令

林十二XII

瞬间登上牛客网热榜榜首!腾讯内部68W字Netty全栈宝典简直太香了

Java 编程 架构 面试 Netty

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