Node.js 体验报告——有关 Node.js 的集中吐槽

Node.js 体验报告——有关 Node.js 的集中吐槽

用了一年多 Node.js, 现在已经是 Node.js 的脑残粉了,这篇日志比较杂,算是我对 Node.js 方方面面的一个集中吐槽。

首先是性能,用起来感觉 Node.js 的性能并没有想象中那么好。内存占用差不多和 Ruby 一个等级,比 Python, PHP 要多。计算性能(即 CPU 使用)上,纯计算并没有太大优势,但因为可以很好地控制异步流程,所以总体表现上来看性能要比 PHP 好很多。个人觉得 Node.js 在性能方面是有很大的潜力的,因为有很多大的项目在致力于提高 JavaScript 虚拟机的性能——比如各大浏览器;同时 JavaScript 是一个语法简单的语言,也是一个开放标准,不像 Python 和 PHP 一样因为顾及兼容性,很难进行大的重构来改善性能。

然后是包管理器和库,Node.js 内置了 npm, 因为 npm 是个非常好用的包管理器,因为 JavaScript 的编写门槛低,因为 JavaScript 本来就有很多优秀的前端库被移植到了后端,所以 NPM 上的包现在已经多于 PyPI 和 RubyGems 了,然后远超 PEAR 和 Composer. Node.js 的开发中不同于 PHP 的一点就是大家都不怕加依赖,每个小需求都去 NPM 上找已有的库来实现——而且往往都能找到。所以 Node.js 的开发基本上就是在组合依赖,然后倾向于把一个即使很小的独立需求写成一个库,这倒是和 UNIX 的思路比较像。再另一方面,Node.js 社区对开源十分友好,这里的友好是指大多数的库都是在 Github 上开放开发的,而且使用的是非常宽松的协议,例如 MIT, 不像 GPL 那么具有「攻击性」。

社区,Node.js 的应用大部分还是 Web 后端,而 Web 后端相关的库基本都是那么几个大牛搞起来的,例如 express, jshttp, jade, mocha 和 koa 就是以 TJ 大神为首的四五个人开发起来的,这倒是个有趣的现象。——虽然 TJ 大神最后决定淡出 Node.js 社区。

工具链,Node.js 比较年轻,很多好用的工具都是近两年刚刚出现的,例如预编译方言, 单元测试和模拟测试,构建工具等;不敢说有多好,但是要比 PHP 好非常多。至于原因,首先很大程度是因为这些库都是既可用于前端又可用于后端的,因为 Web 前端的硬需求,让 Node.js 顺便得益;然后就是因为 JavaScript 灵活而简单的语法,让这些工具可以以一些非常巧妙而优雅的方式来实现。至于 IDE, 依然得益于 Web 前端,还是有一些 IDE 可用的——虽然 JavaScript 语言本身不是很利于静态分析。

语法,我还要再强调一下 JavaScript 的语法简单而灵活,其中重要的一点是 JSON, JSON 几乎是目前 Web 领域最通用的数据格式,而在 JavaScript 对 JSON 具有原生的支持!JavaScript 中所有的数据结构都是围绕着 JSON 的一个超集——Object 展开的,包括数组,函数,对象和类。当然这样也带来一个麻烦,就是因为写起来限制少,导致不知道该怎么写,刚开始学习的时候总免不了反复重构,才能摸清各种设计模式在不同情况下的优劣,找到适合自己和适合具体项目的写法,所以可以说 Node.js 入门简单,但要构建大型项目,还是比较考验开发者的功力的。因为历史遗留问题,JavaScript 的语法算不上优美,不过还好我们有各种预编译方言,比如 Coffee Script, TypeScript, Dart, LiveScript 以及 ClojureScript, 总有一款适合你。

使用场景,JavaScript 是一个通用的编程语言,Web 前后端自然不必说,来看看其他方面。个人以为 Node.js 还是很适合用来编写服务器工具的,或称运维工具,因为运维中很多情况是可以异步工作的,JavaScript 又有比较不错的正则支持,替代 bash 和 Python 也问题不大;Node.js 只需装好解释器,就可以随便用,不用畏手畏脚地避免引入依赖。而桌面和移动设备编程,Node.js 有 node-webkit 以及其他各种外壳,虽然目前使用体验不是很好,但是可以非常显著地降低开发成本,轻松跨平台,想必前途也是光明的。

最后说学习 Node.js, 在我看来,学习 Node.js 分两点,一是要理清 Node.js 的「基于事件回调的异步 IO」,这是 Node.js 与其他主流编程语言最不同的一点。然后第二步就是把 NPM 上 Top 100 的库都看一下,不用细看,只要混个脸熟,知道每个库是干嘛的就行了。完成这两步,那么恭喜你,已经是一个 Node.js 开发者了。

https://jysperm.me/2014/10/1866/


9 回复

Node.js 体验报告——有关 Node.js 的集中吐槽

用了一年多 Node.js, 现在已经是 Node.js 的脑残粉了,这篇日志比较杂,算是我对 Node.js 方方面面的一个集中吐槽。

性能

用起来感觉 Node.js 的性能并没有想象中那么好。内存占用差不多和 Ruby 一个等级,比 Python, PHP 要多。计算性能(即 CPU 使用)上,纯计算并没有太大优势,但因为可以很好地控制异步流程,所以总体表现上来看性能要比 PHP 好很多。个人觉得 Node.js 在性能方面是有很大的潜力的,因为有很多大的项目在致力于提高 JavaScript 虚拟机的性能——比如各大浏览器;同时 JavaScript 是一个语法简单的语言,也是一个开放标准,不像 Python 和 PHP 一样因为顾及兼容性,很难进行大的重构来改善性能。

示例代码:

// 计算斐波那契数列的第 n 项
function fibonacci(n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

console.log(fibonacci(35)); // 递归计算

包管理器和库

Node.js 内置了 npm,因为 npm 是个非常好用的包管理器,因为 JavaScript 的编写门槛低,因为 JavaScript 本来就有很多优秀的前端库被移植到了后端,所以 NPM 上的包现在已经多于 PyPI 和 RubyGems 了,然后远超 PEAR 和 Composer。Node.js 的开发中不同于 PHP 的一点就是大家都不怕加依赖,每个小需求都去 NPM 上找已有的库来实现——而且往往都能找到。所以 Node.js 的开发基本上就是在组合依赖,然后倾向于把一个即使很小的独立需求写成一个库,这倒是和 UNIX 的思路比较像。再另一方面,Node.js 社区对开源十分友好,这里的友好是指大多数的库都是在 Github 上开放开发的,而且使用的是非常宽松的协议,例如 MIT,不像 GPL 那么具有「攻击性」。

示例代码:

# 安装 express 框架
npm install express

社区

Node.js 的应用大部分还是 Web 后端,而 Web 后端相关的库基本都是那么几个大牛搞起来的,例如 express, jshttp, jade, mocha 和 koa 就是以 TJ 大神为首的四五个人开发起来的,这倒是个有趣的现象。——虽然 TJ 大神最后决定淡出 Node.js 社区。

示例代码:

// 使用 express 创建一个简单的 HTTP 服务器
const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

工具链

Node.js 比较年轻,很多好用的工具都是近两年刚刚出现的,例如预编译方言、单元测试和模拟测试、构建工具等;不敢说有多好,但是要比 PHP 好非常多。至于原因,首先很大程度是因为这些库都是既可用于前端又可用于后端的,因为 Web 前端的硬需求,让 Node.js 顺便得益;然后就是因为 JavaScript 灵活而简单的语法,让这些工具可以以一些非常巧妙而优雅的方式来实现。至于 IDE,依然得益于 Web 前端,还是有一些 IDE 可用的——虽然 JavaScript 语言本身不是很利于静态分析。

示例代码:

// 使用 Mocha 进行单元测试
const assert = require('assert');

describe('Array', function() {
    describe('#indexOf()', function() {
        it('should return -1 when the value is not present', function() {
            assert.equal([1, 2, 3].indexOf(4), -1);
        });
    });
});

语法

我还要再强调一下 JavaScript 的语法简单而灵活,其中重要的一点是 JSON, JSON 几乎是目前 Web 领域最通用的数据格式,而在 JavaScript 对 JSON 具有原生的支持!JavaScript 中所有的数据结构都是围绕着 JSON 的一个超集——Object 展开的,包括数组、函数、对象和类。当然这样也带来一个麻烦,就是因为写起来限制少,导致不知道该怎么写,刚开始学习的时候总免不了反复重构,才能摸清各种设计模式在不同情况下的优劣,找到适合自己和适合具体项目的写法,所以可以说 Node.js 入门简单,但要构建大型项目,还是比较考验开发者的功力的。因为历史遗留问题,JavaScript 的语法算不上优美,不过还好我们有各种预编译方言,比如 CoffeeScript, TypeScript, Dart, LiveScript 以及 ClojureScript, 总有一款适合你。

示例代码:

// 使用 JSON 处理数据
const data = {
    name: 'John Doe',
    age: 30,
    hobbies: ['reading', 'coding']
};

console.log(JSON.stringify(data));

使用场景

JavaScript 是一个通用的编程语言,Web 前后端自然不必说,来看看其他方面。个人以为 Node.js 还是很适合用来编写服务器工具的,或称运维工具,因为运维中很多情况是可以异步工作的,JavaScript 又有比较不错的正则支持,替代 bash 和 Python 也问题不大;Node.js 只需装好解释器,就可以随便用,不用畏手畏脚地避免引入依赖。而桌面和移动设备编程,Node.js 有 node-webkit 以及其他各种外壳,虽然目前使用体验不是很好,但是可以非常显著地降低开发成本,轻松跨平台,想必前途也是光明的。

示例代码:

// 使用 child_process 模块执行系统命令
const { exec } = require('child_process');

exec('ls -la', (error, stdout, stderr) => {
    if (error) {
        console.error(`执行出错: ${error}`);
        return;
    }
    console.log(`stdout: ${stdout}`);
    console.error(`stderr: ${stderr}`);
});

学习 Node.js

在我看来,学习 Node.js 分两点,一是要理清 Node.js 的「基于事件回调的异步 IO」,这是 Node.js 与其他主流编程语言最不同的一点。然后第二步就是把 NPM 上 Top 100 的库都看一下,不用细看,只要混个脸熟,知道每个库是干嘛的就行了。完成这两步,那么恭喜你,已经是一个 Node.js 开发者了。

示例代码:

// 使用 async/await 改写回调函数
const fs = require('fs').promises;

async function readFile() {
    try {
        const content = await fs.readFile('./example.txt', 'utf-8');
        console.log(content);
    } catch (error) {
        console.error(error);
    }
}

readFile();

希望这些内容和示例代码能帮助你更好地理解 Node.js 的各个方面。


18岁,高中退学,独立开发者,资深比特币玩家。 应该是个土豪。

好骚年

JS正则不支持后发断言,确实很蛋痛。

厉害, 总结的比较透彻

第二步里面熟悉大部分的包这点我还是比较赞同,因为确实很多新手或者着急的人总是想问用什么来完成**功能~

但是完成了就是一个【 Node.js 开发者】 – 要是我,就只能是【Node初级入门汉】的评价了哦

95年的骚年,膜拜

第二步就是把 NPM 上 Top 100 的库都看一下 作为一个后端开发转node的话,首先是了解各种api的使用,有没有必要阅读几个常用api的源码?需要完全了解源码吗?

Node.js 体验报告——有关 Node.js 的集中吐槽

性能

尽管 Node.js 的性能没有达到最初预期的高度,但在实际应用中,它在异步处理方面的表现确实优于传统的同步处理方式(如 PHP)。Node.js 的异步 I/O 模型使得它可以高效地处理大量并发请求,尤其是在 I/O 密集型应用中。

示例代码:

const http = require('http');

const server = http.createServer((req, res) => {
  fs.readFile('data.txt', 'utf8', (err, data) => {
    if (err) throw err;
    res.end(data);
  });
});

server.listen(3000, () => console.log('Server running at http://localhost:3000/'));

包管理器和库

Node.js 的 npm 包管理器非常强大且易用。由于 JavaScript 生态系统丰富,许多流行的前端库已经被移植到后端,因此你可以很容易地在 npm 上找到你需要的库。

示例代码:

# 安装 Express
npm install express

# 使用 Express 创建一个简单的 HTTP 服务器
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => console.log('Server running at http://localhost:3000/'));

社区

Node.js 的社区主要集中在 Web 后端开发,并且有许多高质量的库,例如 Express、Koa 等。尽管 TJ 大神已决定淡出 Node.js 社区,但社区仍然活跃且贡献度高。

示例代码:

// 使用 Koa 创建一个简单的 HTTP 服务器
const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  ctx.body = 'Hello World';
});

app.listen(3000, () => console.log('Server running at http://localhost:3000/'));

工具链

Node.js 的工具链不断进步,提供了丰富的工具支持,如 ESLint、Babel、Webpack 等。这些工具不仅适用于前端,也可以用于后端开发。

示例代码:

# 安装 ESLint
npm install eslint --save-dev

# 初始化 ESLint
npx eslint --init

# 使用 ESLint 检查代码
npx eslint .

语法

JavaScript 的语法简单而灵活,非常适合快速开发。但随着项目规模的增长,开发者需要掌握更多的设计模式和最佳实践。

示例代码:

// 使用模块化的方式组织代码
const moduleA = require('./moduleA');
const moduleB = require('./moduleB');

moduleA.doSomething();
moduleB.doSomethingElse();

使用场景

Node.js 适用于多种应用场景,如 Web 后端、运维工具和跨平台应用开发。它可以帮助开发者更高效地完成任务,降低开发成本。

示例代码:

// 编写一个简单的运维工具
const fs = require('fs');
const path = require('path');

const folderPath = process.argv[2];
const files = fs.readdirSync(folderPath);

files.forEach(file => {
  console.log(path.join(folderPath, file));
});

学习 Node.js

学习 Node.js 的关键在于理解其异步 I/O 模型,并熟悉 npm 上常用的库。

示例代码:

# 安装常用的库
npm install express lodash axios

# 查阅文档并开始使用这些库

通过以上示例代码,我们可以看到 Node.js 在实际开发中的应用及其优势。希望这些示例能够帮助你更好地理解和使用 Node.js。

回到顶部