Node.js相关——CommonJS规范
1. CommonJS规范产生背景
在后端,JavaScript的规范远远落后并且有很多缺陷,这使得难以使用JavaScript开发大型应用。比如:
- 没有模块系统
- 标准库较少
- 没有标准接口
- 缺乏包管理系统
CommonJS规范 的提出,主要是为了弥补JavaScript没有标准的缺陷。CommonJS API将通过定义处理许多常见应用程序需求的API来填补这一空白,最终提供与Python,Ruby和Java一样丰富的标准库。以达到像Python、Ruby和Java那样具备开发大型应用的基础能力,而不是停留在开发浏览器端小脚本程序的阶段。
应用程序开发人员能够使用CommonJS API编写应用程序,然后跨不同的JavaScript解释器和主机环境运行该应用程序。
2. CommonJS模块规范
CommonJS模块规范主要分为三部分:模块引用、模块定义、模块标识。
2.1 模块引用
//引入http模块,并赋值给变量http var http = require('http');
require函数的基本功能是,读入并执行一个JavaScript文件,然后返回该模块的exports对象。当我们用require()获取module时,Node会根据module.id找到对应的module,并返回module. exports,这样就实现了模块的输出。
require函数使用一个参数,参数值可以带有完整路径的模块的文件名,也可以为模块名。
require("./module/b"); //相对路径 require("../node/module/c"); //绝对路径
文件目录结构如下:
2.2 模块定义
2.2.1 模块(module)是什么
CommonJS规范规定,一个文件就是一个模块,用module变量代表当前模块。 Node在其内部提供一个Module的构建函数。所有模块都是Module的实例。实例代码如下:
function Module(id, parent) {this.id = id;this.exports = {};this.parent = parent;this.filename = null;this.loaded = false; this.children = []; } module.exports = Module; var module = new Module(filename, parent);
每个模块内部,都有一个module对象,代表当前模块。它的属性如下:
- module.id 模块的识别符,通常是带有绝对路径的模块文件名。
- module.filename 模块的文件名,带有绝对路径。
- module.loaded 返回一个布尔值,表示模块是否已经完成加载。
- module.parent 返回一个对象,表示调用该模块的模块。
- module.children 返回一个数组,表示该模块要用到的其他模块。
- module.exports 初始值为一个空对象{},表示模块对外输出的接口。
2.2.2 exports 属性
exports 属性是module对象的一个属性,它向外提供接口。
如 2.1模块引用 中示例,a.js引入b.js作为一个模块,当在b.js中定义如下方法时:
//加法 function add(num1,num2){console.log(num1+num2); }
在a.js中调用却报错
var addMethod = require("./module/b"); //调用模块中的add方法 addMethod.add(1,6);
b.js中的函数要能被其他模块使用,就需要暴露一个对外的接口,exports 属性用于完成这一工作。b.js中的方法定义修改如下:
exports.add = function(num1,num2){console.log(num1+num2); }
在a.js中能够调用。
2.3 模块标识
模块标识就是传递给require方法的参数,必须符合小驼峰命名的字符串,或者以.、..开头的相对路径,或者绝对路径,默认文件名后缀.js。在Node实现中,正是基于这样一个标识符进行模块查找的,如果没有发现指定模块会报错。
根据参数的不同格式,require命令去不同路径寻找模块文件。加载规则如下:
(1)如果参数字符串以“/”开头,则表示加载的是一个位于绝对路径的模块文件。比如,require('/home/marco/foo.js')将加载/home/marco/foo.js。
(2)如果参数字符串以“./”开头,则表示加载的是一个位于相对路径(跟当前执行脚本的位置相比)的模块文件。比如,require('./circle')将加载当前脚本同一目录的circle.js。
(3)如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。
举例来说,脚本/home/user/projects/foo.js执行了require('bar.js')命令,Node会依次搜索以下文件。
/usr/local/lib/node/bar.js/home/user/projects/node_modules/bar.js/home/user/node_modules/bar.js/home/node_modules/bar.js/node_modules/bar.js
这样设计的目的是,使得不同的模块可以将所依赖的模块本地化。
(4)如果参数字符串不以“./“或”/“开头,而且是一个路径,比如require('example-module/path/to/file'),则将先找到example-module的位置,然后再以它为参数,找到后续路径。
(5)如果指定的模块文件没有发现,Node会尝试为文件名添加.js、.json、.node后,再去搜索。.js件会以文本格式的JavaScript脚本文件解析,.json文件会以JSON格式的文本文件解析,.node文件会以编译后的二进制文件解析。
(6)如果想得到require命令加载的确切文件名,使用require.resolve()方法。
CommonJS是同步的,意味着你想调用模块里的方法,必须先用require加载模块。这对服务器端的Nodejs来说不是问题,因为模块的JS文件都在本地硬盘上,CPU的读取时间非常快,同步不是问题。但如果是浏览器环境,要从服务器加载模块。模块的加载将取决于网速,如果采用同步,网络情绪不稳定时,页面可能卡住,这就必须采用异步模式。所以,就有了 AMD解决方案。下一篇我们开始介绍模块化规范的AMD规范;
参考:
https://www.cnblogs.com/huiguo/p/7967241.html
https://nodejs.org/api/modules.html#modules_module_exports
Node.js相关——CommonJS规范相关推荐
- js 多个定时器_Node.js系列深入浅出Node模块化开发——CommonJS规范
前言 本文将为大家透彻的介绍关于Node的模块化--CommonJS的一切. 看完本文可以掌握,以下几个方面: 什么是模块化,以及没有模块化会带来哪些问题,是如何解决的: JavaScript的设计缺 ...
- Node.js相关资源
最近在学习nodejs方面的知识,下面推荐一些好的相关书籍 1. 深入浅出Nodejs. 下载链接: 城通网盘:https://u18444140.ctfile.com/fs/18444140-311 ...
- JS模块化规范对比以及在Node.js的实现
文章目录 写在前面 JavaScript模块化的规范 Node.js 的模块化实现 AMD or CMD 代码示例 ES6模块化标准以及在Node.js的使用 写在前面 关于JavaScript的模块 ...
- nodejs01——安装及使用、服务端及客户端、commonjs规范、fs模块的使用(文件操作及目录操作)、stream、buffer、WebServer、端口、动态资源及静态资源、头信息、请求方式
nodejs的安装及使用 服务端及客户端 commonjs规范 fs模块的使用(文件操作及目录操作) stream buffer // Node.js介绍 Node.js 诞生于2009年,Node. ...
- Node.js(一)——(Node.js安装及使用,通过Node.js搭建服务器,模块化及自定义模块,npm/yarn/nvm,内置模块fs的使用,buffer及stream,新闻列表案例)
目录 1.Node.js介绍 2.安装Node.js 3.使用Node.js实现第一个服务器 3.1初步感受Node.js 3.2Google Chrome 默认非安全端口列表,尽量避免以下端口. 3 ...
- Node.js快速入门之基础模块及常用api
目录 Node特点 模块化 文件 文件读取 文件写入 文件删除 Buffer(缓存数据) 读取/删除目录 输入输出 文件流 写入流 读取流 先流入后流出的整个流程 管道流 Node事件 Os模块和pa ...
- Node.js b站教学视频汇总笔记(完)CommonJS模块规范、 require、npm、Express(中间件)、MongoDB、MySQL
文章目录 Node.js b站教学视频汇总笔记(完)CommonJS模块规范. require.npm.Express(中间件).MongoDB.MySQL 1. Node介绍 为什么要学习Node. ...
- Node.js 官网入门教程(一) CommonJS 模块规范、Node.js REPL、console、CLI、exports
Node.js 官网入门教程(一) CommonJS 模块规范.Node.js REPL.console.CLI.exports 文章目录 Node.js 官网入门教程(一) CommonJS 模块规 ...
- Node.js的核心与红利
唯有明晰历史,才能了然当下,预知未来.作者从历史角度解读Node.js,帮助读者透过猜忌和谣言,看清真实的Node.js,了解Node.js的核心与红利. 令人惴惴不安的Node.js 我们越来越频繁 ...
- 如何让服务器运行js,服务器端JavaScript运行环境Node.js的依赖性管理
众所周知,Node.js是一个基于Chrome V8引擎的服务器端JavaScript运行环境.它采用了一种事件驱动的.非阻塞式的I/O模式,运行起来既轻量级又高效.诚然,我们可以使用单个js文件,来 ...
最新文章
- 理清那么多个OO(面向对象)
- docker分离部署lnmp
- /etc/shadow 密码加密方法
- 码农干货系列【17】--Wind.js与Promise.js
- 文本文档TXT每行开头结尾加内容批处理代码
- hightmaps 按地图上显示的统计数据
- android 系统dialog的应用
- 解决VisualStudio2008下asp.net mvc开发向View中添加服务器控件崩溃的问题
- Cache-control
- kux格式怎么转换成mp3_怎么快速无损地把视频转换成mp3格式?三种方法了解一下吗?...
- 【字符编码】Unicode字符集与字符编码方式
- 如何在两台电脑之间共享文件
- 去除UC浏览器强制嵌入的垃圾广告代码
- 小米4c怎么添加语言怎么设置在哪个文件夹,小米4C怎么加密图片?私密文件夹使用方法...
- 计算机的四个发展阶段的应用,计算机分为哪四个发展阶段
- 数据结构(二)算法绪论
- JQuery中$是什么?
- 单系统 台电x80pro_转载:台电X80 Pro Plus 刷Windows10单系统
- 回忆鸭掌门的麻辣兔丁
- android 地铁地图api,百度地铁图JS API使用
热门文章
- C++ ORM ODB入门
- Android Cursor浅析
- 22.1-在散列集上进行集合操作
- Expression Blend实例中文教程(5) - 布局控件快速入门StackPanel,ScrollViewer和Border
- 二、设置开发、运行环境 (基础教程2)
- Performance Engineering of Software Systems (一)——准备工作
- linux内核奇遇记之md源代码解读之三
- python 多线程 全局锁_python的多线程+GIL全局解释器锁+其他LOCK
- vue 中watch函数名_vue中watch的使用
- stm32 读取sd卡图片显示_全面测试雷克沙1667x 性能,你懂什么叫超高速SD卡吗