非阻塞,单线程,事件驱动。 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 | const http = require('http'); |
有些前端 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 | # ubuntu |
其他操作:
1 | # 查看版本 |
关于 npm 的所有命令,最好都不要用root用户执行,否则会出现各种不可预料的问题。
常见的 npm 命令:
1 | npm init # 将当前目录设置为一个npm库,自动生成package.json文件 |
例如: (查看我的博客下面安装了哪些包)
(用 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