一、一个简单的node程序

1、新建一个txt文件

2、修改后缀

修改之后会弹出这个,点击“是”

3、运行test.js

源文件

使用node.js运行之后的。

如果该路径下没有该文件,会报错

4、运行test2.js

二、模块简单使用

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Node环境中,一个.js文件就称之为一个模块(module)。

模块化的开发的好处:提高代码的可维护性,避免修改代码对其他部分造成修改。

我们编写了一个test.js文件,这个test.js文件就是一个模块,模块的名字就是文件名(去掉.js后缀),所以test.js文件就是名为test的模块。

1、首先。我们把test.js改造一下,创建一个函数,这样我们就可以在其他地方调用这个函数:

函数greet()是自模块中定义的,最后一行是一个赋值语句,意识就是说,把函数greet作为模块的输出暴露出去,这样其他模块就可以使用greet函数了。

2、然后。其他模块怎么使用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函数,接下来我们将使用。

3、注意事项:

在使用require()引入模块时候,注意模块的相对路径,因为main.js和test.js处于同一个目录,所以我们使用当前的目录:

var greet=require('./test');      

如果你写

var greet=require('test');

Node就会依次在内置模块、全局模块和当前模块下查找test.js,容易出现错误。

写代码:

1、模块名是否写对

2、模块文件是否存在

3、相对路径是否写对

三、CommonJS规范

这种模块加载机制被称为CommonJS规范。在这个规范下,每一个.js文件都是一个模块,他们内部各自使用的变量名和函数名都互不冲突,例如:test.js和main.js都申明全局变量var s=‘XXX’,但是互不影响。

一个模块想对外暴露变量,可以使用

module.exports = variable;

一个模块要引用其他模块的变量,使用

var ref = require('module_name');

 四、深入理解模块原理

当我们编写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

node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理的更多相关文章

  1. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  2. Node.js 学习(五)Node.js 事件循环

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. Node.j ...

  3. Node.js学习笔记(1)--一个最简单的服务器请求

    说明(2017-5-2 10:27:03): 1. 需要安装node,http://nodejs.cn/download/ 2. 安装完后,在cmd里输入node -v可以查看版本. 3. 代码foo ...

  4. Node.js 学习(六)Node.js EventEmitter

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.read ...

  5. Node.js学习笔记(五) --- 使用Node.js搭建Web服务器

    1. Node.js 创建的第一个应用 1.引入http模块 var http = require("http"); 2. 创建服务器接下来我们使用 http.createServ ...

  6. Node.js 学习(四)Node.js 回调函数

    Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了. 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都 ...

  7. Node.js 学习(七)Node项目部署工具之forever

    平常无论是使用命令行还是终端通过node app.js启动项目时,当命令行或终端关闭时项目也就随之关闭了;forever则可以在cmd或ssh连接断开时,让项目一直运行,而且可以在项目崩溃时自动重启 ...

  8. node.js学习一——什么是node.js

    定义:node.js是运行在服务器端的运用了谷歌v8引擎的javascript运行平台 特点:1. 异步式I/O(非阻塞式I/O) 2. 事件驱动 什么是异步式I/O(非阻塞式I/O)? 要了解什么是 ...

  9. node.js学习三--------------------- http服务器模块的搭建

    /** * http服务器的搭建,相当于php中的Apache或者java中的tomcat服务器 */ // 导包 const http=require("http"); //创建 ...

随机推荐

  1. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

  2. Content Security Policy 入门教程

    阮一峰文章:Content Security Policy 入门教程

  3. Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)

    Vagrant(官网.github)是一款构建虚拟开发环境的工具,支持 Window,Linux,Mac OS,Vagrant 中的 Boxes 概念类似于 Docker(实质是不同的),你可以把它看 ...

  4. jQuery.Ajax IE8 无效(CORS)

    今天在开发的时候,遇到一个问题,$.get()在 IE8 浏览器不起作用,但 Chrome,Firefox 却是可以的,网上资料很多,最后发现是 IE8 默认不支持 CORS 请求,需要手动开启下: ...

  5. 使用SwingBench 对Oracle RAC DB性能 压力测试

    我们可以使用swingbench这个工具对数据库性能进行压力测试,得到一些性能指标作为参考. SwingBench下载: http://www.dominicgiles.com/downloads.h ...

  6. ABP项目中使用Swagger生成动态WebAPI

    本文是根据角落的白板报的<使用ABP实现SwaggerUI,生成动态webapi>一文的学习总结,感谢原文作者角落的白板报. 1 安装Swashbuckle.core 1.1 选择WebA ...

  7. BPM始终服务于人,落脚于人

    数字经济时代下,云计算.大数据.移动互联已经成为当下企业必须采取的武装力量.随着互联网+.中国制造2025.工业4.0等国家战略的引导与支持,无数的企业在这场数字化浪潮中使尽浑身解数,想要抓住机遇奋力 ...

  8. git init和git init -bare区别

    1 Git init  和 git init –bare 的区别 用"git init"初始化的版本库用户也可以在该目录下执行所有git方面的操作.但别的用户在将更新push上来的 ...

  9. 跟着老男孩教育学Python开发【第五篇】:模块

    递归的案例:阶乘 1*2*3*4*5*6*7- def func(num):     if num == 1:         return 1     return num * func(num - ...

  10. TFS 生成配置

      生成