略懂: 我所认识的 Nodejs

非阻塞,单线程,事件驱动。 Nodejs 到底是个啥?前端那帮 javascript 的后端扩展技能?全栈技能?不清楚。

如果不出意外,我应该会深入学习并使用 nodejs, 至少是完成我的评论系统。(本文浅谈)

文章写完了之后,我补充一句: 千万不要去看网上那些什么入门&菜鸟教程;纯碎浪费生命,浪费时间。

要看就去看专家的指导,即在 Node.js 里面深耕了好几年,有 N 篇文章都在谈论 node 的细分领域专家之作

初印象

原来仅仅运行在浏览器端的 Javascript 居然可以运行在服务端,这是不是太震撼了?

况且 Js 设计本来就很精简,但是后端要处理的事务还是非常多的,怎么样处理好?

OK, Nodejs 出现了,作为服务端脚本语言开发技术,姑且可以称为Node.js框架。(严格来说是一种运行时环境)

Node.js Vs Js

  • Javascript 是一种嵌入式语言,需要一个宿主环境,浏览器是一种, Node 也是一种
  • Nodejs 不是 js ,是一种和JavaScript有着相同语法的后端语言,有自己的编译器,运行环境和标准库的框架
  • Nodejs 做不了 JavaScript 的活(渲染前端页面),但能写网站后后台(操作数据库,与操作系统通信)

Nodejs和JavaScript不是同一种语言,只不过他们共享一套相同的语法(ECMAscript 标准)。
两种语言的运行环境和解决的问题完全不同。

后端其他对手

适用 js 语言实现服务器上的开发工作,nodejs后端开发真的没有问题么?

  • 前端语言 + nodejs(后端运行时环境,解析环境) = 后端开发技术 node.js

Node.js 写起来大致是什么什么感觉? 来一个 hello world 吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});

server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

有些前端 js 学习了 node 就觉得自己是全栈了。。(注意我没有说他们水平不高啊)

殊不知后端还有 Php各种快速开发框架, Java系企业级应用,C++后端,Python后端, Gopher等。

后端是一块竞争非常激烈的地盘,真为 node 捏一把汗。

Web开发

到底什么是 web 开发?我一直在做底层的工作,其实真的不太明白,但是就我看到的这么多讲 web 开发的书来说。

web 开发可能是指 围绕 HTPP,HTTPS 展开的系列构建 Web 应用的开发技术&过程:

  • 前端显示(包括界面 UI 设计)
  • 后端业务 & 数据处理
  • 数据库服务器维护
  • 网站架构&业务设计

主要就这4个方面,但是这里面也有很多问题(除了后端常常谈到的高并发,高可用)。

棘手问题

了解 web 开发之后, 发现其实也有很多棘手的问题,Node.js 是如何处理的?

  • 跨平台兼容
  • 跨浏览器适配
  • 模块和包如何管理
  • 同步IO,异步IO如何封装的
  • 系统模块如何封装(进程,文件系统,网络)
  • 数据库如何交互(支持哪些数据库)
  • 和前端如何沟通 (包括 Ajax)
  • 是否涉及&支持传输层网络编程(TCP/UDP)

然而我相信,越是偏上层的脚本语言&服务端语言,越是简单;Node.js 应该能处理好。(这还不够)
但是能用和适用是不一样;很多语言也能完整具体的某些功能,但是却不是最适用的技术。

Node.js的解决之道

大致看了看官网,可以简单得出结论,设计和封装Nodejs的这帮人还是有水平的

并且,可以初步断定,Node.js的学习成本远比 Golang 的小,更不用提 C++ 了。

Node.js 要比 Golang 难,我把键盘吃了。 :P

下面由浅入深吧,慢慢说。(BTW: 我的博客就是基于 Node.js 的)

仔细看看的全景地图,估计也被吓到了,好完善啊。

官网文档按关键字整理的,太烂了。下面不按照这个顺序,按照老手指出来的路径去看,见下图:

NPM

按照 官方 的意思,这是个包管理系统&库管理系统。
意思是说和homebrew, apt, pkg, go get是一个性质的东西?

npm是一个让JavaScript程序员分享和复用代码的工具。有了它,JS程序员能高效地管理和发布自己要分享的代码。(发布的包就是 node 模块)

它是和 node.js 一起安装的,去官 node.js 网下载即可,当然也可以自己安装:

1
2
3
4
5
# ubuntu
curl -sL https://deb.nodesource.com/setup_4.x | bash -
apt-get install -y nodejs
# 添加淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org

其他操作:

1
2
3
4
5
# 查看版本
node -v

# 更新 npm
sudo npm install npm -g

关于 npm 的所有命令,最好都不要用root用户执行,否则会出现各种不可预料的问题。

常见的 npm 命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
npm init  # 将当前目录设置为一个npm库,自动生成package.json文件
npm install 包名 --save # 安装包,并且更新到package.json中去
npm install 报名 --save-dev # 安装包,并且更新到package.json的开发依赖中
npm list --depth=0 # 列出已安装模块
npm list -g --depth=0 # 列出全局安装的包
npm list --depth=0 2> /dev/null # 忽略标准错误输出(npm ERR!这种错误将被忽略)

# 升级当前目录下的所有模块
npm update
npm update 包名 # 更新指定包
npm install npm -g # 升级npm
npm install -g n && n stable # 升级node.js到最新稳定版

# 代理设置(可选)
npm config set proxy=http://127.0.0.1:1080
npm config set proxy=https://127.0.0.1:1080

例如: (查看我的博客下面安装了哪些包)

(用 ls node_modules 会发现里面安装了好多包)

Permission Denied问题:

使用npm命令总是会出现这个问题,解决方法最简单的是把npm目录的拥有者修改为当前用户的名字。

1
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules}

其他的内容,还有 package.json 管理项目依赖发布node.js模块作为npm包权限管理等等。

Node.js 使用 npm 进行包管理,所有依赖、配置、启动信息等会放到 package.json 文件里。在拿到程序代码后,需要先进行 npm install 才可以获得所有需要的依赖。然后就可以通过 npm start 来启动应用。

点到为止,需要的时候(用到的时候)再来详细说一说。

其他特性

本来想展开各个模块说的,但是后来越看越失望,就算了。

因何而失望? 你想多少语言在做 运行时 的工作,又有几个语言做的好呢?

本文就点到为止,我对 Golang 的热情,明显超过 Node.js。

可能由于我是个 C系 的开发人员,所以对 Golang 感觉更好;但更多的是,我觉得 Node.js 没有什么亮点惊艳到我,所谓的单线程,异步,非阻塞,事件驱动,流,文件系统;我们在 linux系统api,select/poll,epoll,std:future, std:asyn,Qt事件,信号和槽等等中是不是玩的太久了?

下面给出了一个多年 Javascript 的老手的博客介绍 node.js 初体验,前端人员写的,还不错。

(先这样吧,有时间我再回来,深入学习探讨一下)

总结

王老师说:追求科技的结果应该是人的生活品质得到改善,幸福感得到提升。
所以不要是个新奇的技术就去追;这只能显得你没有思考,没有头脑

经过简单 overview,确实也没有发现太多点赞的地方。但至少看出 node 偏 http 应用层,如果业务复杂了或者需要频繁扩展了,node还适用么?

Node 擅长IO密集型应用(处理非关键的,大量异步请求还算不错),不擅长计算密集型应用(耗时长的性能够么?),应该根据项目具体需求来做权衡?

Node.js 可以高效的帮助前端开发人员解决一些棘手的脚本工作,但却不能直接用于前端
Node.js 有助于前端人员更好的理解 Js, 闭包, 事件驱动等
但是 Node.js 真的能够胜任后端的工作,这个值得商榷,个人感觉 不堪大用

以后再见分晓吧。(写评论系统的时候再说)


Merlin 2018.2 不做科技的奴隶:仅仅从技术角度的话,看好 Golang,不看好 Node.js

文章目录
  1. 1. 初印象
    1. 1.1. Node.js Vs Js
    2. 1.2. 后端其他对手
  2. 2. Web开发
  3. 3. 棘手问题
  4. 4. Node.js的解决之道
    1. 4.1. NPM
    2. 4.2. 其他特性
  5. 5. 总结
|