我所认识的node————node好在哪里?学习路径是什么?

贫道钰衡 2019-11-05 11:29:44
NodeJS 是什么 对 NodeJS 最大的误解莫过于认为 NodeJS 就是 JavaScript,我们来看一下官网对 NodeJS 的定义Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.简单翻译就是 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。 Node.js 的包管理器 npm,是全球最大的开源库生态系统。 所以 Node 并不是一门语言,而是一个 runtime,也就是我们经常说的运行时,和我们非常熟悉的 JRE—— Java Runtime Environment 非常类似。如同浏览器是 JavaScript 的运行时,我们有时候也会称之为宿主环境或者运行环境,Node 是 JavaScript 在服务器端的一个运行时。个人感觉称 Node 为 JavaScript runtime 也不是很准确,因为 JavaScript 除了 ECMAScript 还包括了其在浏览器端的实现 BOM、DOM,这些在 Node 中是不存在的,叫 ERE 会更贴切一些,但是 Node 因为运行在服务器端,虽然缺失的 BOM、DOM,但是多了很多针对服务器编程常用的封装,我们来简单了解一下 Node 的组成 ECMAScript 解释器 npm—— node package manager CommonJS module system:NodeJS 诞生在 JavaScript 没有官方模块系统的年代,只能自己做一个规范并且内置实现(最新的 8.5 已经开始支持 ES6 modules) debugger:方便开发者进行代码调试 fs、Stream、http、util 等常用内置模块 在上层我们经常接触的就是这些,到这里我们可以了解 Node 并不是运营在服务器端的 JavaScript,而是在服务器端的 JavaScript runtime。 Node 好在哪里 好多同学会有和我一样的感觉,Node 一夜爆红,变成了前端的必备技能,面试要求掌握一门后端语言,我们也可以大大方方说熟悉 Node 了。那么 Node 就行好在哪里,为什么会忽然编程前端界的网红? 使用 JavaScript 作为方言毋庸置疑是非常重要一个原因,前端都其语法很熟悉,有天然的亲切感。然而这并不是全部原因,甚至不是主要原因,在更早之前已经有了在服务器端运行 JavaScript 的尝试 —— Rhino,但并没有达到 Node 的成就,真正使 Node 流行的原因是其官方定义中的第二句 Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. 首先需要了解几个基本常识 1.CPU 运算远远快于 I/O 操作 2.Web 是典型的 I/O 密集场景 3.虽然JavaScript 是单线程(随着 JavaScript 演进,这条马上要不成立),但 JavaScript 的 runtime Node 并不是,毕竟人家很多代码是 C++ Node 使用了事件驱动和非阻塞的 I/O 模型,使 Node 轻量高效,非常适合 I/O 密集的 Web 场景。 很多语言是依赖的多进程、线程解决高并发,一个线程处理一条用户请求,处理完成了释放线程,在阻塞 I/O 模型下, I/O 期间该用户线程所占用的 CPU 资源(虽然十分微量,大部分交给了 DMA)什么都不做,等待 I/O,然后响应用户,而且开启多个进程/线程 CPU 切换 Context 的时间也十分可观。 就像饭店的服务员只负责点菜,如果给每个厨师都配一个服务员,服务员把客人菜单给大厨后就玩手机等着一样,你是老板你也生气,况且不同于饭店大厨工资高于服务员,在计算机世界,CPU 资源比 I/O 宝贵的多。 说 NodeJS 在高并发、I/O 密集场景性能高,也就是 Web 场景性能高主要也是解决这个问题,没必要一个厨师配一个服务员,整个饭店说不定一个服务员就够了,剩下的钱可以随便做其它事情。 用户请求来了, CPU 的部分做完不用等待 I/O,交给底层完成,然后可以接着处理下一个请求了,快就快在 1.非阻塞 I/O 2.Web 场景 I/O 密集 3.没那么多线程 Context 切换,多出来的开销是检查一个 EventLoop 除了 Web 场景的高性能,Node 可以流行起来还有一个重要原因——恰逢其时。 回头看这三年前端经过了可以成为大爆炸的时代,代码构建、自动化、单元测试等等随着前端工作职责范围扩大和代码复杂度膨胀充斥到所有前端眼前,前端不再是附庸在 HTML 上的小玩具,而是整个用户体验的中心。相应的前端对周边工具的要求越来越多,让前端用 Java 写相关工具或者让后端同学帮忙写都不是最好的选择,前端的问题前端自己解决才是最合适的,Node 以其足够简单了的特性,迅速扩充了其生态,各种好用的工具应运而生,正如前辈们说的——所有可以通过 JavaScript 解决的问题都将用 JavaScript 解决。 可以看看知乎上讨论,小芋头君说的团队用 Node 的理由 对于我们团队,其实使用NodeJS的理由,反而提现在其他方面: 1.生态活跃,解决方案众多,我们的Node服务化,架构,协作方式都很先进,因为社区活跃,有很多思路可以借鉴,架构变得越来越优,开发方式也变得越来越趋向社区规范。反观java,一直在玩老掉牙的架构,每天就是在搞环境问题,大部分开发完全不知道内部原理,而且没有什么大的技术追求。 2.轻量,部署轻量,开发轻量。我们可以用最小的阿里云配置就部署出一个小应用来,用来做微服务化架构非常完美。想想把一个java系统拆分成十几个微服务(java)的场景,每个进程启动起来都要1G内存吧至少,high起来吧阿里云。 3.我们公司技术栈采用多语言,多一个语言就多一种可能性,例如一些用node实现特别适合的服务,Phantomjs类的服务(图片,模拟操作等),WebSocket啊之类的。 工欲善其事,必先利其器 vscode,调试 Node 特别方便,比 web storm 轻量,比 sublime 更像是各 IDE,atom 就不吐槽了 supervisior,我们在修改 Node 程序的时候需要不断重启才能看到结果,supervisor 可以帮我们监视文件变化,自动重启应用代码 如果使用 Mac 的话,iTerm2 是必备 这样就可以了,开发 Node 并不需要准备太多 兴趣是最好的老师 如果我们有一定的 JavaScript 基础,那么从头看文档是一件很无趣的事情,我们可以做一件很有成就感的小事情来帮助我们培养对 Node 的兴趣,同时了解到大部分常用的 API,给大家推荐的兴趣项目是做一个爬虫,我们可以随便无恶意的爬取一些网页内容,使用数据库或者文件保存到本地 1.使用 Chrome 团队的 headless 工具 Puppeteer 发起请求,获得异步数据 2.使用 async/await 解决异步回调问题 3.使用 fs、stream 保存文件到本地,甚至可以练习一下 json 转 csv,顺便处理中文乱码问题 4.使用 mongoose 保存数据到数据库 这样的一个小项目让我们可以体验用 Node 编程的乐趣,同时在写代码过程中会用到请求、文件处理等我们在浏览器端很少遇到的问题,对 Node 有了全貌的了解之后,我们就可以通过官方文档系统的学习了 官方文档 Node 的官方文档不止是 API 的调用,也是很多模块的教程,尤其是 Stream 相关,是学习必备,关于 debug 技巧的 Debugging Node.js Apps 是我们开篇需要看的,推荐大家使用 vscode,调试最简单 一般来讲我们肯定需要看的常用模块 1.buffer 2.fs 3.path 4.http 5.url 6.stream 7.events 如果英文文档阅读有些障碍,可以看一下 Node 中文文档 作者:Samaritan 链接:http://www.imooc.com/article/20579
...全文
56 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5,657

社区成员

发帖
与我相关
我的任务
社区描述
Web开发应用服务器相关讨论专区
社区管理员
  • 应用服务器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧