Node模块(四)

我是小探花 2017-12-08 13:52:13 ⋅ 159 阅读

第一部分 模块的简单介绍


在介绍模块之前还是得提一下JavaScript缺少这些功能:


1. JavaScript没有模块系统。没有原生的支持密闭作用域或依赖管理。

2. JavaScript没有标准库。除了一些核心库外,没有文件系统的API,没有IO流API等。

3. JavaScript没有标准接口。没有如Web Server或者数据库的统一接口。

4. JavaScript没有包管理系统。不能自动加载和安装依赖。


于是便有了[CommonJS](http://www.commonjs.org)规范的出现,其目标是为了构建**JavaScript在包括Web服务器,桌面,命令行工具,及浏览器方面的生态系统。**


> CommonJS制定了解决这些问题的一些规范,而Node.js就是这些规范的一种实现。



模块是对某个功能的封装,Node中模块与文件是一一对应的;我们用两个数的相加为例子, 来展示Node中模块的定义与使用方式:《以下两个js文件在同一目录下》


模块add.js, 实现的功能是传入两个数,返回和;


```

//add.js

exports.addTwo = function(x, y){

return x + y;

};

```


调用模块add.js,求两个数的和


```

//calculate.js


//只需要require需要调用的文件即可

var calTwoNum = require('./add.js');

var sum = calTwoNum.addTwo(1, 2);

console.log(sum);


```


打印的结果



```

$ node calculate.js 

3

```

非常简单的定义**出口(export)**与**引用(require)**;那么封装与调用就会非常简单.


第二部分 内部实现


抱着**知其然还得知其所以然**的态度, 模块是怎么被引用的呢??


2.1 模块加载

2.1.1模块的分类


```

* 原生(核心)模块: 在Node.js源代码编译的时候编译进了二进制执行文件,加载的速度最快。

* 位置: 在源代码 lib/ 之中

* 如:http;

* 文件模块: 动态加载的,加载速度比原生模块慢。

* 如自己封装的模块;

* 总的一点, node都将他们进行了缓存;

```


**require() 总是会优先**加载*核心模块*。例如,require('http') 总是返回编译好的 HTTP 模块,而不管这个文件的名字。


  1. 模块的前缀没有的, require('http'), 可能是 core module.

  2. 模块的前缀'/' 表示绝对路径, 例如 require('/home/marco/foo.js') 将会加载 /home/marco/foo.js文件。

  3. 模块的前缀'./' 表示相对路径, add.js和.calculate.js在同一目录下;

  4. require() 的模块不是一个本地模块,并且不以 '/', '../', 或 './' 开头,那么 Node 会从当前模块的父目录开始,尝试在它的 node_modules 文件夹里加载模块。


例如:如果 '/home/ry/projects/foo.js' 里的文件加载 require('bar.js'),那么 Node 将会按照下面的顺序查找:


```

/home/ry/projects/node_modules/bar.js

/home/ry/node_modules/bar.js

/home/node_modules/bar.js

/node_modules/bar.js

```


2.2 如何繁杂的加载顺序, 如何确保效率? 


模块第一次加载后会被被缓存。这就是说,每次调用 require('add') 都会返回同一个对象,当然,必须每次都要解析到同一个文件。

多次调用 require('add') 也许不会导致模块代码多次执行。


第三部分 模块对象


1.module.children, 该模块引用的对象, 是一个数组类型;

2.module.exports: 模型系统提供的方法, 方法出口;

3.module.filename{String}:模块完全解析的文件名。

4.module.loaded: {Boolean}

模块是已经加载完毕,还是在加载中。

5.module.parent: {Module Object}

引入这个模块的模块。



全部评论: 0

    我有话说:

    Node模块之Events模块(五)

    Node模块之Events模块(五)

    Node模块之fs模块(六)

    屏幕快照 2017-08-08 上午10.53.21.png 第一部分 概述 Node.js 提供一组类似UNIX(POSIX)标准的文件操作API,Node.js中操作文件的模块是fs(File

    Node 模块之 util URL queryString path(八)

    第一部分 util util是一个Node.js核心模块,util模块设计的主要目的是为了满足Node内部API的需求。其中包括:格式化字符串、对象的序列化、实现对象继承等常用方法。要使用util

    Node实战篇:Express--jade模板引擎(七)

    Jade(Pug) — Node Template Engine,一个高性能的模板引擎,专为 Node 而做......

    Node实战篇:使用joi来验证数据模型 (十)

    Joi 是 hapijs 自带的数据校验模块,他已经高度封装常用的校验功能,本文就是介绍如何优雅地使用 joi 对数据进行校验......

    Nodejs视频服务器 切片ffmpeg

    Node 视频服务器 切片ffmpeg

    Node异步式I/O和异步式编程(三)

     Node.js 最大的特点就是异步式 I/O(或者非阻塞I/O)与事件紧密结合的编程模式。 第一部分: I/O 1.阻塞I/O与非阻塞I/O概念 1.1阻塞I/O(同步I/O) 线程在

    Node实战篇:Express中间件与request()

    Express 是一个路由和中间件 Web 框架,其自身只具有最低程度的功能:Express 应用程序基本上是一系列中间件函数调用。

    Node实战篇:阶段项目(九)

    项目整体预览 项目的github地址 界面逼格还行-_- 主要功能: 登陆; 退出; 所用的主要模块: express, 路由.静态文件.模块分工等; express-session, 采用

    Node实战篇:Express路由(三)

    Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。

    2018年8个技巧来构建更好的Node.js应用程序

    2018年8个技巧来构建更好的Node.js应用程序

    Node实战篇:Express 中间件-body-parser(五)

    body-parser是什么?body-parser是一个HTTP请求体解析中间件,使用这个模块可以解析JS

    Node实战篇:Express-session解析(八)

    Session和HTTP协议属于不同层面的事物,HTTP属于ISO七层模型的最高层应用层,前者Session不属于后者,前者HTTP是具体的动态页面技术来实现的,但同时它又是基于后者的。

    「轻阅读」聊一聊6种常用的架构设计模式(上)

      许多现代应用都需要在企业级规模上进行构建,有时甚至需要在互联网规模上进行构建。这些应用都需要满足可扩展性、可用性、安全性、可靠性和弹性需求。 在本文中,我将谈论一些设计模式,这些模式

    为什么要使用 Node.js?这几点你必须知道!

    经过这几年的发展,前端普遍进入了技术深水区,只会Web页面开发已经难以满足企业的需求,Node逐渐成为了刚性技能。 但Node在业务上的使用还没有那么普及,有的时候想用老板还不同意,本文将从4个角度

    NodeJS 10.5.0 中的线程:实用介绍

    几天前,Node.js版本10.5.0发布,其中包含的主要功能之一是添加了线程支持。

    Nodejs 接入 公众号【逗比版】

    Nodejs 接入 公众号 需求:Boss: 我们要接入公众号,你看下文档对接下。Me: 🆗 然后,可能因为对腾讯的反感,加之网上对腾讯的吐槽,怀着愤世嫉俗的态度胡乱的找资源,看方案

    Node实战篇:Nodejs 链接 Mariadb 实例

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL