es6,nodejs的模块化暴露导入

282 阅读2分钟

es6的模块化暴露导入

分别暴露、统一暴露

暴露 export.js

// 分别暴露
export let a = 1
export function A() {
    console.log('我是分别暴露')
}

// 统一暴露
let b = 2
function B() {
    console.log("我是统一暴露")
}
export { b , B }

引入 import.js

import { a, A, b, B } from './export.js'

console.log(a) // 1
A() // 我是分别暴露

console.log(b) // 2
B() // 我是统一暴露

可以看到分别暴露、统一暴露都是将暴露的数据存放在一个对象中,在引入时通过解构赋值引入相应的值。

默认暴露

暴露 export.js

export default function C() {
    console.log('我是默认暴露')
}

引入 import.js

import C from './export.js'

C() // 我是默认暴露

默认暴露是并没有把数据放在一个对象中,而是导入时直接将暴露内容返回。

nodejs 模块暴露导入

nodejs 中暴露方式有两种 module.exports 和 exports,其实二者是一个东西,在初始时指向同一个地址,只不过 exports 的书写更简便,但最终的暴露结果还是以 module.exports 为准,因此在书写时尽量只使用其中一个。

image.png

module.exports

module.exports = {
    a: 0,
    b() {
        console.log('module.exports 暴露')
    }
}
// 解构赋值导入 a, b
const { a, b } = require('./exports')

console.log(a) // 0
b() // module.exports 暴露

exports

exports.a = 0

exports.b = function() {
    console.log('exports 暴露')
}
const A = require('./exports')

cosole.log(A) // { a: 0, b: [Function (anonymous)] }

以上是两种方式的暴露和导入方式

错误方式

exports = {
    a: 0,
    b() {
        console.log('module.exports 暴露')
    }
}
const A = require('./exports')

cosole.log(A) // {}

输出的值为空对象,原因是给 exports 赋值,改变了exports 的指向地址,而 module.exports 仍然指向原来的空对象,另外因为决定最后输出内容的是 module.exports 所以该方式并不可行.

总结

  1. es6 的暴露引入时,是用 export 和 import 搭配,而 nodejs 则是 module.exports(exports) 和 require() 搭配。
  2. 当然在 nodejs 环境中也是可以使用 import 导入,但是需要在 package.json 里面加上 "type": "module",同样是 export 和 import 搭配。