nodejs是JavaScript的一个在后端的运行环境,关于nodejs的认识,咱们能够看上一篇文章<<初识nodejs>>,咱们要使用nodejs,首先要安装nodejs,安装的东西你可理解为java中的运行环境同样,至于怎么安装,咱们最好安装nvm(nodejs version manage),安装的过程也写在了另外一篇博客<>(那时懵懂期,回头再修改的详细一点)php
那么nodejs做为一个后台的平台,他能够为咱们提供的不少,咱们能够用JavaScript语言进行文件的获取,删除等等文件操做,咱们能够用JavaScript开一个本地服务器,咱们能够和mongoDB配合来搭建后台,他给咱们前端带来了太多的惊喜,让咱们深深的迷恋上了它,但正所谓学一个新知识时,咱们都须要从简,从基础学起,那么在nodejs环境下,咱们的基本语法又是怎样的呢?前端
nodejs是支持ES6的,因此在这里你能够尽情的去写,不用考虑浏览器不兼容了(这里是后端,哈哈),安装好了nodejs后,咱们在终端输入node,就会进入到nodejs环境,这里咱们能够输入:java
console.log("hello world!");
能够看到咱们控制台输出了hello world,我第一次写的时候还觉得这是chrome的开发者模式呢,这或许就是chrom v8引擎的做用吧,咱们这些简单的指令能够直接在终端中输出,那么若是是运行一大段代码呢?咱们能够写个js文件里边,node
在hello.js中 var hello = function(){ console.log("hello function"); } hello();
而后node hello.js,这样咱们文件中写的程序就能运行出来了,nodejsshi是基于commonJS的,因此当咱们的程序变大的时候,就可使用模块了,nodejs是模块化的,什么是模块,每一个模块就是nodejs的每一个功能,咱们有http模块来提供服务器,有fs模块来提供对文件操做的各类功能,咱们写的代码能够分红一个一个的模块,这样能够提升咱们代码的复用性,以及减小代码之间的耦合性,能够避免函数名和变量名的冲突.python
java和python使用import来导入其余函数库,而php和ruby是经过require,上边也说过,nodejs是基于CommonJS的,在node中咱们可使用require这个关键字来导入模块.例如:c++
var http = require('http'); var fs = require('fs');
首先,咱们可使用原生的和外部的模块,这些模块都是别人写好的或者nodejs自带的,他们都给咱们提供各类各样的功能,咱们只须要直接require它们就能使用了,
其次,咱们也能够本身编写模块,好比你讲一个输出hello的函数单独封装成一个模块,ajax
//这里是hello模块 (function(){ var hello = function(){ console.log("hello"); } export.hello = hello; })()
这里咱们使用exports导出hello函数,而后再另外一文件中经过require导入另外一个模块,这时再另外一个模块中,chrome
var hello = require('hello.js');//而后运行hello hello.hello();//这时输出hello
咱们还有另外一种导出方法,在hello.js中npm
module.exports=hello;//经过这种导出方法,咱们在使用它的时候的用法为: --- var hello = require('hello.js'); hello();//这时输出hello
这时咱们就出现了不一样的地方后端
在讲他们的区别以前,咱们先来看一个例子,这个例子以及他们区别的理解我是在node中文社区学习的.
var a ={name:"小明"}; var b =a; console.log(a.name); console.log(b.name); //输出 小明 小明 b.name="小李"; console.log(a.name); console.log(b.name); //输出 小李 小李
这里,因为a直接赋给b,这是b至关于a的引用,a和b指向同一块存储区域,这是改变了b的name,相应的a的name也发生了改变.那么这就引出了咱们要讲的:
- module.exports本来就是一个空对象
- exprots是这个对象的一个引用变量
- 平时咱们require进来的就是module.exports对象
上边这三大法则就是module.exports和exports的主要区别,咱们能够这样来看:
1 exports = module.exports; 2 因此如今exports.hello = hello; 3 就至关于module.exports.hello = hello; 4 当另外一文件导入var hello = require('hello.js');时 5 由于是导入了module.exports这个对象,因此使用hello的时候,是:hello.hello();
因此咱们导出模块的时候,直接使用module.exports=hello;就好了.
听说nodejs可使用c/c++编写二进制模块,但由于前端出身的我虽然学过c/c++但研究不深,我仍是好好的用JavaScript吧!
当咱们须要使用一些线上的模块时,只须要去nodejs.org里边去搜索,而后使用npm install就能够了,npm是和nodejs捆绑在一块儿的,
回调函数是什么呢?咱们对于JavaScript中的函数应该不陌生了吧,回到函数就是JavaScript中的函数.当在nodejs中,回调函数是来实现异步调用的,回调函数被称为要去完成的任务,nodejs中很频繁的使用回调函数,nodejs中的全部的API模块都是由回调函数所实现的.由回调函数来实现异步调用,其实就是给你形成一种假象,让你像使用ajax同样让你感受很顺畅,不堵不堵不堵(嘿嘿嘿)!
咱们先提早看一下nodejs在读取文件的时候的一个操做
1 //这里有一个input.txt文件,里边的内容为:"这是一个测试文件" 2 var fs = require('fs'); 3 var data = fs.readFileSync('input.txt');//同步操做 4 console.log(data.toString()); 5 console.log("程序结束");
运行这个文件后显示
1 这是一个测试文件 2 程序结束 3 //这是咱们很容易理解的程序流程,程序从上往下一次执行,
那咱们再来看一个
//input.txt文件中的内容不变, var fs = require('fs'); fs.readFile('input.txt',function(err,data){ if(err){return console.eror(err)} console.log(data.toString()); }); console.log("程序结束");
这时咱们再运行这个程序,就会发现输出的内容为:
程序结束 这是一个测试文件 //这是咱们会发现先输出的是"程序结束"
咱们先不用去纠结上边那个函数是什么意思,咱们应该能看得出来,第二次的函数是一个回调函数,这就是咱们的阻塞和非阻塞IO的区别,当程序执行到异步的读文件时,会先将这个相对耗时多的步骤存入一个事件循环(looping)中,转而去执行下边的程序,等到下边的程序执行完了以后再回去执行回调函数这个它存起来的任务,而在程序执行的时候就给我形成一个感受,好快!这就是咱们异步调用,至少目前我感受,这个异步调用时nodejs的利器.
nodejs的基本语句仍是JavaScript,只不过它是模块化开发,更有利咱们去管理代码,他的异步调用时他的一大利器,这不一样于其余多线程的语言,咱们只是经过回调函数来实现这一功能,因此它对服务器的压力也不大!