1、一个简单的node程序node
一、新建一个txt文件编程
二、修改后缀浏览器
修改以后会弹出这个,点击“是”闭包
三、运行test.js编程语言
源文件模块化
使用node.js运行以后的。函数式编程
若是该路径下没有该文件,会报错函数
四、运行test2.js学习
2、模块简单使用ui
为了编写可维护的代码,咱们把不少函数分组,分别放到不一样的文件里,这样,每一个文件包含的代码就相对较少,不少编程语言都采用这种组织代码的方式。在Node环境中,一个.js文件就称之为一个模块(module)。
模块化的开发的好处:提升代码的可维护性,避免修改代码对其余部分形成修改。
咱们编写了一个test.js
文件,这个test.js
文件就是一个模块,模块的名字就是文件名(去掉.js
后缀),因此test.js
文件就是名为test的模块。
一、首先。咱们把test.js
改造一下,建立一个函数,这样咱们就能够在其余地方调用这个函数:
函数greet()是自模块中定义的,最后一行是一个赋值语句,意识就是说,把函数greet做为模块的输出暴露出去,这样其余模块就可使用greet函数了。
二、而后。其余模块怎么使用test模块的这个greet函数?在编写一个main.js文件,调用test模块的greet函数。
PS:引入test模块用Node提供的require函数:
var greet=require('./test');
引入模块做为变量保存在greet变量中,那greet变量究竟是什么东西?其实变量greet就是test.js中咱们使用module.exports=greet,输出的greet函数。因此,main.js就成功引用
test.js模块中定义的greet函数,接下来咱们将使用。
三、注意事项:
在使用require()引入模块时候,注意模块的相对路径,由于main.js和test.js处于同一个目录,因此咱们使用当前的目录:
var greet=require('./test');
若是你写
var greet=require('test');
Node就会依次在内置模块、全局模块和当前模块下查找test.js,容易出现错误。
写代码:
一、模块名是否写对
二、模块文件是否存在
三、相对路径是否写对
3、CommonJS规范
这种模块加载机制被称为CommonJS规范。在这个规范下,每个.js文件都是一个模块,他们内部各自使用的变量名和函数名都互不冲突,例如:test.js和main.js都申明全局变量var s=‘XXX’,可是互不影响。
一个模块想对外暴露变量,可使用
module.exports = variable;
一个模块要引用其余模块的变量,使用
var ref = require('module_name');
4、深刻理解模块原理
当咱们编写JavaScript代码时候,咱们能够申请全局变量:
var s = 'global';
在浏览器中,大量的使用全局变量可很差。若是你在a.js中使用全局变量s,那么在b.js中也使用全局变量s,将会形成冲突,b.js中对s赋值会改变a.js的运行逻辑。
也就是说,JavaScript语言自己并无一种模块化的机制来保证不一样模块之间可使用相同的变量名。
那么Node.js是如何实现这一点?
实现这个模块的功能,并不须要语法层面的支持。Node.js也并不会增长任何JavaScript语法。实现模块功能在于JavaScript是一种函数式的变成语言,它支持闭包。若是咱们把一段JavaScript代码用一个函数包装起来,这段代码的全部“全局”变量就了函数内部的局部变量。
test.js代码是这样的
var s='hello';
var name='world';
console.log(s+' '+name+'!')
Node.js加载test.js后,能够把代码包装一下,变成这样:
(function(){ var s='Hello'; var name='world'; console.log(s+' '+name+'!'); })();
这样一来,原来的全局变量s变成了匿名函数内部的局部变量。若是Node.js继续记载其余模块,这些模块中定义的“全局”变量s也互不干扰。
因此Node.js利用JavaScript的函数式编程的特性,垂手可得实现模块的隔离。
模块输出modeule.exports怎么实现?
Node能够先准备一个对象module:
//准备module对象 var module={ id:'hello', exports:{} } var load=function(module){ //读取test.js代码 function greet(name){ console.log('HelloBaby'+name+'!'); } module.exports=greet; //test.js代码结束 return module.exports; }; var exported=load(module); //保存module save(module,exported);
可见,变量module是Node在加载js文件以前准备的一个变量,并将其传入加载函数,test.js中能够直接使用变量module缘由在于它其实是函数的一个参数:
module.exports=greet;
经过把参数module传递给load()函数,hello.js就顺利吧一个变量传递给Node执行环境,Node会把module变量保存起来。
因为Node保存了全部导入的module,当咱们用require()获取module时,Node找到相应的module,把这个module的exports变量返回,这样,另一个模块就能够顺利拿到模块的输出:
var greet=require('./test');
以上是Node实现JavaScript模块的一个简单的原理介绍。
学习网址(参考廖雪峰):http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434502419592fd80bbb0613a42118ccab9435af408fd000