一、概念
1、什么是 CommonJs
JavaScript是一个强大的面向对象语言 它有很多快速高效的解释器
然而 JavaScript标准定义的API只是为了构建基于浏览器的应用程序 并没有制定一个用于更广泛的应用程序的标准库
CommonJS规范的提出主要是为了弥补当前JavaScript没有标准的缺陷
它的终极目标就是:提供一个类似Python 或 Ruby 或 Java语言的标准库 而不只是停留在脚本程序的阶段
用CommonJS API编写出的应用 不仅可利用JavaScript来开发客户端应用 还可编写如下应用:
- 服务器端JavaScript应用程序(即NodeJs)
- 命令行工具
- 桌面图形界面应用程序
简单来说:CommonJs就是模块化的标准 而Nodejs就是CommonJs(模块化)的实现
2、NodeJs中的模块化
在Node中 模块分为两类 一类是Node自己提供的模块 称为核心模块 另一类是用户编写的模块 称为文件模块
-
核心模块部分在 Node 源代码的编译过程中编译进了二进制执行文件
在Node进程启动时 部分核心模块就被直接加载进内存中 所以这部分核心模块引入时 文件定位和编译执行这两个步骤可以省略掉
并且在路径分析中优先判断 因此 它的加载速度是最快的
如:HTTP 模块 URL 模块 Fs模块
这些模块都是Nodejs内置的核心模块 可直接引入使用 -
文件模块则是在运行时动态加载 需要完整的路径分析 文件定位 编译执行过程
其速度相比核心模块稍微慢一些 但使用场景非常多
此种模块需自己定义
3、CommonJS(Nodejs)中自定义模块的规定
-
可将公共的功能抽离成为一个单独的js文件作为一个模块
默认情况下 这个模块里面的方法或者属性 外界是没法访问的
若要让外界可以访问模块里面的方法或者属性 则必须在模块里面通过exports
或module.exports
来暴露属性或者方法 -
在需要使用这些模块的文件中 通过
require()
方法引入模块
此时 即可使用模块里暴露的属性和方法了
模块化用到了面向对象的思想 类似于Java中的类的概念
二、案例
1、普通使用
config.js
var msg="This is Config";
// 暴露属性
module.exports=msg;
commonJs1.js
var http=require("http");
// 引入自定义的模块
var msg=require("./config.js") // 指定路径引入
var app=http.createServer(function(req,resp){
resp.writeHead(200,{
"Content-Type"