(2)JavaScript模块化 - CommonJS规范

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u014711094/article/details/80301843

介绍

  • global对象
    node模块采用CommonJS规范,每个js文件是一个模块,内部变量、函数、类私有。
    可以使用global对象分享变量,但不推荐
// a.js
global.x = 1

// b.js
require('a')
x   // 1
  • module对象
// one.js
var two = require('two')

console.log(module)

// 输出
Module {
  id: '.',
  exports: {},
  parent: null,
  filename: 'G:\\temp\\one.js',
  loaded: false,
  children:
   [ Module {
       id: 'G:\\temp\\two.js',
       exports: [Object],
       parent: [Circular],
       filename: 'G:\\temp\\two.js',
       loaded: true,
       children: [],
       paths: [Array] } ],
  paths:
   [ 'G:\\temp\\node_modules',
     'G:\\node_modules' ] 
}

id: 当前模块为’.’,引用模块为filename
filename: 绝对路径
exports: 模块导出的对象,即对外输出接口,默认为{}
parent: 引用该当前模块的其他模块,默认为null,可据此判断当前module是否是程序入口
loaded: module是否已加载
children: 当前模块引用的模块
paths: 当前模块目录直到根目录的node_modules目录

  • exports变量

每个module内部exports指向module.exports

exports === module.exports  // true

// 相当于在模块内定义了exports变量
var exports = module.exports

导出模块

// one.js
var x = 1
var addX = (val) => val + x

// 正确导出module
module.exports = {x, addX}

exports.x = x
exports.addX = addX

module.exports.x = x
module.exports.addX = addX

// 错误方法,只是改变了exports变量的指向
exports = {x, addX}

require命令

使用方法

  • 基本用法
// two.js
var x = 1
var addX = (val) => val + x
var increX = () => ++x

module.exports = {x, addX, increX}

// one.js引用two,文件扩展名默认为js,以下都正确
var two = require('two')
var two = require('two.js')
var two = module.require('two')
  • 模块缓存
// 不使用var,存在变量提升(variable hoisting),下面清空缓存会无效
const two = require('./two')
const three = require('./two')  

two.x = 3
two === three   // true,加载的是缓存
three.x         // 3

// 模块缓存保存在require.cache对象中,使用delete删除
delete require.cache['G:\\temp\\two.js']    // 使用绝对路径,且G为大写

// 删除所有模块缓存,这里是当前one.js模块和two.js
for (const key in require.cache) {
  delete require.cache[key]
}

two.x = 3
two === three   // false,重新加载
three.x         // 1
  • 模块加载机制
const two = require('./two')

two.increX()    // 2
two.x           // 1,x的值未改变

require对象

  • require.main访问主模块(accessing the main module)
// 直接运行one.js
node one.js

// one.js
const two = require('./two')
require.main === module     // true,main属性指向当前模块

// two.js
require.main === module     // false,main属性指向one.js
require.main.filename       // 'G:\\temp\\one.js',获取程序入口(the entry point)

参考:
http://javascript.ruanyifeng.com/nodejs/module.html
https://nodejs.org/dist/latest-v10.x/docs/api/modules.html
http://nodejs.cn/api/modules.html

猜你喜欢

转载自blog.csdn.net/u014711094/article/details/80301843