跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 一杯茶的时间,上手 Node.js
未分類
2020 年 5 月 20 日

一杯茶的时间,上手 Node.js

一杯茶的时间,上手 Node.js

資深大佬 : huan1043269994 26

我们研发开源了一款基于 Git 进行技术实战教程写作的工具,我们图雀社区的所有教程都是用这款工具写作而成,欢迎 Star 哦

如果你想快速了解如何使用,欢迎阅读我们的 教程文档哦

Node.js 太火了,火到几乎所有前端工程师都想学,几乎所有后端工程师也想学。一说到 Node.js ,我们马上就会想到“异步”、“事件驱动”、“非阻塞”、“性能优良”这几个特点,但是你真的理解这些词的含义吗?这篇教程将带你快速入门 Node.js ,为后续的前端学习或是 Node.js 进阶打下坚实的基础。

此教程属于Node.js 后端工程师学习路线的一部分,欢迎来 Star 一波,鼓励我们继续创作出更好的教程!

起步

什么是 Node ?

简单地说,Node (或者说 Node.js ,两者是等价的)是 JavaScript 的一种运行环境。在此之前,我们知道 JavaScript 都是在浏览器中执行的,用于给网页添加各种动态效果,那么可以说浏览器也是 JavaScript 的运行环境。那么这两个运行环境有哪些差异呢?请看下图:

一杯茶的时间,上手 Node.js

两个运行环境共同包含了 ECMAScript,也就是剥离了所有运行环境的 JavaScript 语言标准本身。现在 ECMAScript 的发展速度非常惊人,几乎能够做到每年发展一个版本。

提示

ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现。在日常场合,这两个词是可以互换的。更多背景知识可参考阮一峰的《 JavaScript 语言的历史》。

另一方面,浏览器端 JavaScript 还包括了:

  • 浏览器对象模型( Browser Object Model,简称 BOM ),也就是 window 对象
  • 文档对象模型( Document Object Model,简称 DOM ),也就是 document 对象

而 Node.js 则是包括 V8 引擎。V8 是 Chrome 浏览器中的 JavaScript 引擎,经过多年的发展和优化,性能和安全性都已经达到了相当的高度。而 Node.js 则进一步将 V8 引擎加工成可以在任何操作系统中运行 JavaScript 的平台。

预备知识

在正式开始这篇教程之前,我们希望你已经做好了以下准备:

  • 了解 JavaScript 语言的基础知识,如果有过浏览器 JS 开发经验就更好了
  • 已经安装了 Node.js ,配置好了适合自己的编辑器或 IDE
  • 了解相对路径和绝对路径

学习目标

这篇教程将会让你学到:

  • 浏览器 JavaScript 与 Node.js 的关系与区别
  • 了解 Node.js 有哪些全局对象
  • 掌握 Node.js 如何导入和导出模块,以及模块机制的原理
  • 了解如何用 Node.js 开发简单的命令行应用
  • 学会利用 npm 社区的力量解决开发中遇到的难题,避免“重复造轮子”
  • 了解 npm scripts 的基本概念和使用
  • 初步了解 Node.js 的事件机制

运行 Node 代码

运行 Node 代码通常有两种方式:1 )在 REPL 中交互式输入和运行; 2 )将代码写入 JS 文件,并用 Node 执行。

提示

REPL 的全称是 Read Eval Print Loop (读取-执行-输出-循环),通常可以理解为交互式解释器,你可以输入任何表达式或语句,然后就会立刻执行并返回结果。如果你用过 Python 的 REPL 一定会觉得很熟悉。

使用 REPL 快速体验

如果你已经安装好了 Node,那么运行以下命令就可以输出 Node.js 的版本:

$ node -v v12.10.0 

然后,我们还可以进入 Node REPL (直接输入 node),然后输入任何合法的 JavaScript 表达式或语句:

$ node Welcome to Node.js v12.10.0. Type ".help" for more information. > 1 + 2 3 > var x = 10; undefined > x + 20 30 > console.log('Hello World'); Hello World undefined 

有些行的开头是 >,代表输入提示符,因此 > 后面的都是我们要输入的命令,其他行则是表达式的返回值或标准输出( Standard Output,stdout )。运行的效果如下:

一杯茶的时间,上手 Node.js

编写 Node 脚本

REPL 通常用来进行一些代码的试验。在搭建具体应用时,更多的还是创建 Node 文件。我们先创建一个最简单的 Node.js 脚本文件,叫做 timer.js ,代码如下:

console.log('Hello World!'); 

然后用 Node 解释器执行这个文件:

$ node timer.js Hello World! 

看上去非常平淡无奇,但是这一行代码却凝聚了 Node.js 团队背后的心血。我们来对比一下,在浏览器和 Node 环境中执行这行代码有什么区别:

  • 在浏览器运行 console.log 调用了 BOM,实际上执行的是 window.console.log('Hello World!')
  • Node 首先在所处的操作系统中创建一个新的进程,然后向标准输出打印了指定的字符串, 实际上执行的是 process.stdout.write('Hello World!n')

简而言之,Node 为我们提供了一个无需依赖浏览器、能够直接与操作系统进行交互的 JavaScript 代码运行环境!

Node 全局对象初探

如果你有过编写 JavaScript 的经验,那么你一定对全局对象不陌生。在浏览器中,我们有 document 和 window 等全局对象;而 Node 只包含 ECMAScript 和 V8,不包含 BOM 和 DOM,因此 Node 中不存在 document 和 window;取而代之,Node 专属的全局对象是 process。在这一节中,我们将初步探索一番 Node 全局对象。

JavaScript 全局对象的分类

在此之前,我们先看一下 JavaScript 各个运行环境的全局对象的比较,如下图所示:

一杯茶的时间,上手 Node.js

可以看到 JavaScript 全局对象可以分为四类:

  1. 浏览器专属,例如 window、alert 等等;
  2. Node 专属,例如 process、Buffer、__dirname、__filename 等等;
  3. 浏览器和 Node 共有,但是实现方式不同,例如 console(第一节中已提到)、setTimeout、setInterval 等;
  4. 浏览器和 Node 共有,并且属于 ECMAScript 语言定义的一部分,例如 Date、String、Promise 等;

Node 专属全局对象解析

process

process 全局对象可以说是 Node.js 的灵魂,它是管理当前 Node.js 进程状态的对象,提供了与操作系统的简单接口。

首先我们探索一下 process 对象的重要属性。打开 Node REPL,然后我们查看一下 process 对象的一些属性:

  • pid:进程编号
  • env:系统环境变量
  • argv:命令行执行此脚本时的输入参数
  • platform:当前操作系统的平台

提示

可以在 Node REPL 中尝试一下这些对象。像上面说的那样进入 REPL (你的输出很有可能跟我的不一样):

$ node Welcome to Node.js v12.10.0. Type ".help" for more information. > process.pid 3 > process.platform 'darwin' 

Buffer

Buffer 全局对象让 JavaScript 也能够轻松地处理二进制数据流,结合 Node 的流接口( Stream ),能够实现高效的二进制文件处理。这篇教程不会涉及 Buffer。

__filename 和 __dirname

分别代表当前所运行 Node 脚本的文件路径和所在目录路径。

警告

__filename 和 __dirname 只能在 Node 脚本文件中使用,在 REPL 中是没有定义的。

使用 Node 全局对象

接下来我们将在刚才写的脚本文件中使用 Node 全局对象,分别涵盖上面的三类:

  • Node 专属:process
  • 实现方式不同的共有全局对象:console 和 setTimeout
  • ECMAScript 语言定义的全局对象:Date

提示

setTimeout 用于在一定时间后执行特定的逻辑,第一个参数为时间到了之后要执行的函数(回调函数),第二个参数是等待时间。例如:

setTimeout(someFunction, 1000); 

就会在 1000 毫秒后执行 someFunction 函数。

代码如下:

setTimeout(() => {   console.log('Hello World!'); }, 3000);  console.log('当前进程 ID', process.pid); console.log('当前脚本路径', __filename);  const time = new Date(); console.log('当前时间', time.toLocaleString()); 

运行以上脚本,在我机器上的输出如下( Hello World! 会延迟三秒输出):

$ node timer.js 当前进程 ID 7310 当前脚本路径 /Users/mRc/Tutorials/nodejs-quickstart/timer.js 当前时间 12/4/2019, 9:49:28 AM Hello World! 

从上面的代码中也可以一瞥 Node.js 异步的魅力:在 setTimeout 等待的 3 秒内,程序并没有阻塞,而是继续向下执行,这就是 Node.js 的异步非阻塞!

提示

在实际的应用环境中,往往有很多 I/O 操作(例如网络请求、数据库查询等等)需要耗费相当多的时间,而 Node.js 能够在等待的同时继续处理新的请求,大大提高了系统的吞吐率。

在后续教程中,我们会出一篇深入讲解 Node.js 异步编程的教程,敬请期待!

理解 Node 模块机制

Node.js 相比之前的浏览器 JavaScript 的另一个重点改变就是:模块机制的引入。这一节内容很长,但却是入门 Node.js 最为关键的一步,加油吧

大佬有話說 (29)

  • 資深大佬 : Solace202

    喝了两杯茶了。。。

  • 資深大佬 : wszgrcy

    吨吨吨,我喝完了

  • 資深大佬 : narfnas

    什么茶能喝这么久

  • 資深大佬 : v2vTZ

    主还有干货么?我看着买点茶叶

  • 資深大佬 : Mac

    注意,你将浪费你人生中一杯茶的时间看介绍,请从起步开始看。。。

  • 資深大佬 : greatgodwei

    喝了都快吐了, 还要喝

  • 資深大佬 : WilsonGGG

    赞

  • 資深大佬 : soli

    有人请喝茶,那就喝一杯。先干为敬。

  • 資深大佬 : Leonard

    一杯茶是要出系列么

  • 資深大佬 : areless

    实话实说,这杯茶没有隔壁 lua python 那几杯清淡。

  • 資深大佬 : Flobit

    你放错节点咯

  • 主 資深大佬 : huan1043269994

    @Flobit 我是放的 Node.js o(╥﹏╥)o,貌似被改了?

  • 主 資深大佬 : huan1043269994

    @Leonard 嗯嗯☺️

  • 資深大佬 : MaxTan

    又是你? 有没有一桶饭时间的教程,一杯茶太快了

  • 資深大佬 : dinjufen

    真的是一杯茶,用来摸鱼挺不错的!

  • 資深大佬 : alinwu05

    教程真不错!赞

  • 資深大佬 : libook

    看到“Node.js 太火了”这一句之后,我反复确认了一下发帖时间,确认不是 2014 年……

    其实学 Node 真的很快,因为 Node 本身没多少东西,官网刷一遍 Guides 和 API 就 OK 了。
    搞后端大量的知识都是关于系统架构和中间件。

    当然 JS 语言本身是个大坑。

  • 資深大佬 : Sivan

    你这茶是 1.25L 装的吧?

  • 資深大佬 : zooo

    嗝,喝饱了。。

  • 資深大佬 : Jafee

    写的真的很好,赞!

  • 資深大佬 : zengming00

    技术的东西会的人越多越不值钱,程序猿总是努力使大家都失业

  • 資深大佬 : ironMan1995

    上手很简单,深入很难。我已经从 C 开始学了

  • 資深大佬 : finely

    这些教程都是你自己写的吗,很难得见到这样逻辑清晰言简意赅的教程了,希望能继续写下去,迟早会火

  • 主 資深大佬 : huan1043269994

    @finely 谢谢你,这些是由我们图雀社区的认证作者写的哦,我们是今年年初新创的一个专门传播实战技术教程的社区,主要研发开源了一款实战教程写作工具 Tuture,然后创建了一个社区用来汇聚这些教程,有兴趣可以查看我们的文档( https://www.yuque.com/tuture/product-manuals/wsv091 ),或者关注我们的公众号交流哦

  • 資深大佬 : huangbangsheng

    只看了一盏茶的时间。“什么是 node ?”
    还不错

  • 資深大佬 : yafoo

    @libook 为什么说是大坑?有哪些大坑?

  • 資深大佬 : reiji

    这个系列超级喜欢,爱你!

  • 主 資深大佬 : huan1043269994

    @reiji 爱你❤️! Thanks♪(・ω・)ノ

  • 資深大佬 : libook

    @yafoo JS 学习曲线平缓,上手也很快,但是上手之后要想达到精通需要很长时间。
    1. 语法格式对换行和缩进不敏感( C 语言风格),不像 Python 那样风格相对统一,想要写出优美的代码需要更多的经验积累。
    2. 提供的语法特性非常多,2015 年之前几年不更新一次,但是在 2015 年之后,几乎每个月多有多项新的特性增加,一直持续到现在,一个问题往往可以用不同的特性组合出不同的方案出来,不像 Go 那样“高度标准化”,开发人员花在代码选型方面的时间也更多。
    3. 弱类型(虽然现在正在逐渐补充一些类型),对于逻辑密集型的程序会非常高效,但对于类型密集的场景 Bug 风险会比较高。所以需要大量经验的积累才能确保写出可靠的代码。
    4. 可应用领域太多了,Web 应用开发、服务端开发、工具开发、数据库和中间件脚本、App 端开发、硬件开发(树莓派可以用 GPIO 的 JS API 开发)、桌面应用开发……每一个领域都有引擎、框架、库可以学。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具