NodeJS遵循commonJs的语法标准

  • 引入:require()
  • 导出:module.exports或者exports

Node中的模块化

  • 在Node中,一个JS就是一个模块
  • 在Node中,每一个JS文件的js代码都是独立运行在一个函数中,而不是全局作用域

    • 怎么证实是一个函数呢?咱们能够输入只有函数有的:console.log(arguments)
    • 当咱们输入 console.log(arguments.callee + ''),就会发现,输入的是一个函数。(arguments.callee保留的就是以后的函数)
    • 这个函数就长这样:

      // exports:该对象用来将变量或者喊出裸露到内部// require:函数,用来引入内部模块// module:module代表的是以后的模块自身,exports就是module的一个属性。所以咱们即能够应用exports导出也能够应用module.exports导出// __filename:以后文件的一个残缺门路// __dirname:以后文件所在的文件夹的门路function (exports, require, module, __filename, __dirname) {// 我在01_module.js输入的,显示的就是我以后js文件这个函数const md = require('./02_module')console.log(md.name)console.log(md.num)console.log(md.sayHi())console.log(arguments.callee + '')}
  • 在Node中,一个模块中的变量和函数在其余函数中无奈间接拜访。咱们能够通过exports或者module.exports向内部裸露变量和办法
  • 在Node中,通过require()函数来引入内部模块

    • require()能够传递一个文件的门路作为参数,Node将会主动依据该门路来引入内部模块
    • 留神的是,这里的门路,如果应用相对路径,必须以./或者../结尾,不能省略。
    • 应用require()引入模块后,该函数返回一个对象,这个对象代表的就是引入的模块

简略说下module.exports和exports区别

  • 其实exports = module.exports。
  • exports只能应用.的模式向里面裸露外部的变量

    • exports.x = xxx
  • module.exports既能够通过.的模式,也能够应用间接赋值

    • mudule.exports.x = xxx
    • module.exports = {}
  • 为什么exports不能应用间接赋值呢?这波及到数据的类型和内存(数据寄存地位)

    • 数据的类型分为值类型和援用类型,值类型又叫根本数据类型或者简略数据类型,援用类型又叫简单数据类型
    • 内存分为站内存和堆内存。
    • 咱们的值类型是间接放在栈内存中,每个数据之间互相独立。
    • 援用类型的数据是放在堆内存中的,然而它有个寄存地址,这个地址是放在栈内存中的。

      // 值数据类型,变量a寄存在栈内存中,值为100var a = 100// 援用数据类型,变量b寄存在栈内存中,值是援用类型数据在堆内存中的地址,而援用尅性的数据自身寄存在堆内存中var b = {    name: '景天',    age: 18}
    • exports = module.exports,原本export是指向module的exports,然而如果咱们应用exports = {},那么export的指向就扭转了,不再指向module.exports。

NodeJS模块中分成两大类

  • 外围模块

    • 由Node引擎提供的模块
    • 外围模块的标识就是名字
  • 文件模块

    • 由用户本人创立的模块
    • 文件模块的标识,就是文件的门路。

简略的demo

// 01_module.js----引入const md = require('./02_module')const fs = require('fs')console.log(md.name)console.log(md.num)console.log(md.sayHi())
// 02_module.js----导出console.log(111111)// exports导出exports.name = '模块2中的A'exports.num = 1000exports.sayHi = function() {    console.log(`大家好`)}// module.exports导出形式1module.exports.name = '模块2中的A'module.exports.num = 1000module.exports.sayHi = function() {    console.log(`大家好`)}// module.exports导出形式2module.exports = {    name: '模块2中的A',    num: 1000,    sayHi: function() {        console.log(`大家好`)    }}