NodeJs入坑一NodeJs初识
一、前言
按照惯例,先扯淡,就因为这货,现在才有了各大公司招聘的全栈工程师,正是因为它,让以前只会写前端的人也能写起后端服务器代码来了。所以呢,你招一个会NodeJs的前端,它都能把后端干了,一个人干了两个人的事,你说哪个公司不想要。但是我还是要同情一下前端的兄弟们,真是苦了你们了,以前你们只是写页面就完了,现在还得写后台,再加上各种前端框架,什么Vue,Angular,React啊,恭喜你们,现在微信又带了一波小程序的节奏,唉,可怜的娃啊。
NodeJs看着也带Js后缀,但是它和VueJs,Angular,ReactJs可不一样,后三个都是框架,而NodeJs是平台,运行时环境。怎么说呢,就是NodeJs之于JavaScript,就好比jvm之于Java,就好比CLR之于c#,而Vue,Angular,React之于JavaScript就好比于 SpringMVC 之于Java,Asp.Net MVC,这个栗子举得应该是十分清楚了吧。也就是说一般的js都是在浏览器上执行,能力也有限,只能操作浏览器上边的东西,不可以读写你操作系统的文件什么的,而配上node环境的js是在你电脑上执行,可以读写你操作系统的文件啥的,一不小心还能把你的操作系统中的东西都给你删除了,多可怕。
但凡一个东西火了,我们要用它,所以它必有过人之处,也必有好的地方。所以呢,NodeJs好的地方就是 :
1.用JavaScript作为服务器端语言,这东西火啊,谁都会,简直没有学习成本,只用背几个api就行了啊。
2.统一前后端啊,全栈开发只需要学习一门语言,老板高兴了,招几个前端啥都有了,你给我写写写写写(为前端同学默哀3分钟)。
3.擅长处理高并发,做网站和文件读写相关的应用很不错。
4.参看前三点。(暂时还想不起来,假装有第四点)
I am very 皮。
二、关于NodeJs的介绍
我们先来看NodeJs官方给的介绍
2.1 第一句话
Node.js® is a JavaScript runtime built on . 说NodeJs是一个基于谷歌V8JavaScript解析引擎的一个JavaScript 运行时。(据说V8是目前最快的js 解析引擎,毕竟大厂出品,值得信赖)。
2.2 第二句话
Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. 说NodeJs采用了事件驱动,非阻塞的IO模型,所以很轻,效率也很高。(所以处理并发很给力)
2.3 第三句话
Node.js' package ecosystem, , is the largest ecosystem of open source libraries in the world. 说NodeJs的包生态系统,npm,是世界上最大的开源库生态系统。(厉害了,我的哥)
三、Node中的JavaScript
3.1 没有BOM和DOM
众所周知,as we know,浏览器中的JavaScript是有dom和bom的,因为这样才可以操作html和浏览器相关的东西,比如document对象,window对象的,但是在Node中的js是没有这些对象的,因为很显然,不需要操作html和浏览器,因为压根在服务器端就没有这些东西。
如图所示,在node中没有window和document对象,输出时就会报错。
3.2 提供了一些服务器级别的API
除了没有dom和bom一说,在语法上是一样的,都是基于ECMAScript的,另外的是Node提供了一些服务器级别的api,比如操作文件、网络请求,http什么的,这些在浏览器端的js是没有这些功能的。
3.3 Node中的模块系统
Node中没有全局作用于的概念,在 Node 中,只能通过 require 方法来加载执行多个 JavaScript 脚本文件,默认每个文件就是一个模块,两个模块中的变量不会有污染问题,也就是说两个文件中可以有相同的变量,但是在浏览器中的js是不允许这样做的。如果你同时在a.js 和b.js中声明 var foo = 'bar' ;这在Node中是允许的。但是在浏览器中就会报错。
可以看出,在a.js中输出foo,是a的值,在b.js中调用add方法,结果是b中的add函数在起作用,由此可以看出,模块之间不存在变量污染问题,每个模块都是独立的作用域。
Node中通过require加载并执行其中的代码,文件与文件之间由于是模块作用域,所以不会有全局污染的问题,模块是完全封闭的,外部无法访问内部,内部也无法访问外部。
但是模块之间是需要通讯的,Node为每个文件(也就是模块)提供了一个exports对象,默认情况下,该对象是一个空对象,你要做的就是把需要外部访问使用的成员手动挂载到exports接口对象中,然后谁来require这个模块,返回值就是模块内部的exports对象。
可以看出require的返回值是一个空对象,也就是b.js中的exports对象,接下来我们对exports对象进行操作,看看会有什么结果。
可以看出返回的对象里边已经有了我们赋值的属性。这样,我们就可以使用这些属性和功能,就可以进行模块之间的通讯。
3.4 Node中的核心模块
核心模块是由Node提供的一个个具有名字的模块,它们都有自己特殊的名称标识,例如: fs 文件操作模块、http 网络服务构建模块、os 操作系统信息模块、path 路径处理模块等等。所有核心模块在使用的过程中必须手动的用require方法来加载,例如使用文件系统模块,var fs = require('fs');
四、传说中的四行代码开发Web服务器
var http = require('http'); //加载http模块 var server = http.createServer(); //创建服务器 server.on('request', function (request, response) { //注册request请求事件 response.end('hello,nodejs') }); server.listen('4396', function () { //监听4396端口 console.log('服务器已经启动成功了'); });
浏览器访问:http://localhost:4396/ 响应如下
刚看到,感觉是真的厉害,就想问问Node 你究竟干了什么。
五、总结
总之,NodeJs开启了JavaScript的新的神秘之旅,目前正在探索中,不过前几天看到Node之父说NodeJs设计的出现了很大的失败,又出了个叫deno的东西,唉,前端兄弟们真是堪忧。。。。
推荐阅读
-
又一巨头入坑,索尼推出深度学习程序开发软件
-
Nodejs实现的一个静态服务器实例_node.js
-
初识NodeJS
-
javascript - 新手想在短期内写一个个人博客,是用php还是用nodejs?
-
node.js - windows的服务器,一个文件夹最多能放多少个文件而不会影响php/nodejs/java等读取文件的速度?
-
微信入坑第一弹 微信公众号第一篇推文 第一财经微信公众号 微信公众号第一条消
-
比较一下nodejs中间件Koa和Express
-
一文快速了解Nodejs中的模块系统
-
NodeJs安装npm包一直失败的解决方法
-
nodejs学习(一)--express+ejs生成项目