资讯专栏INFORMATION COLUMN

node中 模块导入和导出的探究

Anshiii / 1340人阅读

摘要:模块的文件名,带有绝对路径。返回一个布尔值,表示模块是否已经完成加载。返回一个对象,表示调用该模块的模块。表示模块对外输出的值。

我们在编写js过程中,经常会碰到 requrie和import的写法,也会看到export default,exports的写法,他们能不能混用呢,我们来探究一下

当前环境:
node版本 v9.6.1 
操作系统 Mac
module

我们打印出module,结果如下

module.id 模块的识别符,通常是带有绝对路径的模块文件名。
module.filename 模块的文件名,带有绝对路径。
module.loaded 返回一个布尔值,表示模块是否已经完成加载。
module.parent 返回一个对象,表示调用该模块的模块。
module.children 返回一个数组,表示该模块要用到的其他模块。
module.exports 表示模块对外输出的值。
exports与module.exports



我们可以看到在模块中exports和module.exports 是同一个对象
就相当于,文件执行前默认执行了一下语句

let exports = module.exports;
export
var firstName = "Michael";
var lastName = "Jackson";
var year = 1958;

export {firstName, lastName, year};

执行结果

我们看到在node v9.6.1 版本中并不支持export,我们使用bable转译后看一下


其实使用export,编译后还是使用的exports

export default
var firstName = "Michael";
var lastName = "Jackson";

export default firstName;
export {lastName };

关于node中模块导出结论

所以node中导出模块只会用到了module.exports,其他语法都只是一些包装而已

require 当modle.js为exports的形式时

module.js

var firstName = "Michael";
var lastName = "Jackson";

exports.default = firstName;
exports.lastName = lastName;

index.js

const test4 = require("./modle");
console.log(test4);

结果

{ default: "Michael", lastName: "Jackson" }
当modle.js为export的形式时

module.js

var firstName = "Michael";
var lastName = "Jackson";

export default firstName;
export lastName = lastName;

index.js

const test4 = require("./modle");
console.log(test4);

结果:

{ default: "Michael", lastName: "Jackson" }
结论

require接受到的是module.exports对象
当你使用export default firstName时,转化成了exports.default = firstName;
所以无论你使用什么样的形式导出模块,对于require来说都是一样的

import 当modle.js为export的形式时
var firstName = "Michael";
var lastName = "Jackson";

export default firstName;
export { lastName };

index.js

import test6 from "./module";
console.log(test6);

结果

Michael

这里就和require不一样了,import默认导出的是 export default

index.js

import * as test6 from "./module";
console.log(test6);

结果:

{ default: "Michael", lastName: "Jackson" }

这时候导出的结果才和require一致
当import test6 from "./module"是,默认会查找default,假如没有export default那么 test6为undefined,那么要导出lastName就得使用

import { lastName } from "./module";
当modle.js为exports的形式时
var lastName = "Jackson";
var firstName = "Michael";

exports = { lastName , firstName };

index.js

import test7 from "./module";
console.log(test7);

结果

{ firstName: "Michael", lastName: "Jackson" }
结论

导出模块可以使用 export和exports,引入模块可以使用 import和require,但两两可以交叉使用,
import/export 最终都是编译为 require/exports 来执行的
只是export 会有一个default的不同,但一般来说export对应import,exports对应require。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94137.html

相关文章

  • Node.js模块化机制原理探究

    摘要:要想让模块再次运行,必须清除缓存。用户自己编写的模块,称为文件模块。并且和指向了同一个模块对象。模块路径这是在定位文件模块的具体文件时指定的查找策略,具体表现为一个路径组成的数组。 前言 Node应用是由模块组成的,Node遵循了CommonJS的模块规范,来隔离每个模块的作用域,使每个模块在它自身的命名空间中执行。 CommonJS规范的主要内容: 模块必须通过 module.exp...

    aikin 评论0 收藏0
  • javascript知识点

    摘要:模块化是随着前端技术的发展,前端代码爆炸式增长后,工程化所采取的必然措施。目前模块化的思想分为和。特别指出,事件不等同于异步,回调也不等同于异步。将会讨论安全的类型检测惰性载入函数冻结对象定时器等话题。 Vue.js 前后端同构方案之准备篇——代码优化 目前 Vue.js 的火爆不亚于当初的 React,本人对写代码有洁癖,代码也是艺术。此篇是准备篇,工欲善其事,必先利其器。我们先在代...

    Karrdy 评论0 收藏0
  • 深入 CommonJs 与 ES6 Module

    摘要:目前主流的模块规范模块通用模块如果你在文件头部看到这样的代码,那么这个文件使用的就是规范实际上就是全局变量这三种风格的结合这段代码就是对当前运行环境的判断,如果是环境就是使用规范,如果不是就判断是否为环境,最后导出全局变量有了后我们的代码和 目前主流的模块规范 UMD CommonJs es6 module umd 模块(通用模块) (function (global, facto...

    sanyang 评论0 收藏0
  • JS 模块导入/导出

    摘要:本文主要介绍几种模块导入导出的方法。默认导出如果只在一个文件中提供了一个导出的口,就可以使用默认导出在中可以看到输入同样是模块导入导出方法,使用的模块方法,要比中的也就是模块方法更加的差异非常大。 在开发中基本不会将所有的业务逻辑代码放在一个JS文件中,特别是在使用前端框架,进行组件化开发中时,会复用相应的组件。这时,就会用到模块导入/导出的方法了。 当然,上面提到有模块的概念,也是在...

    wall2flower 评论0 收藏0
  • 富婆给你说require、importexport

    摘要:所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。目前,主要有两个库实现了规范和。这些导出对象用名称进行区分,称之为命名式导出。 简单粗暴,富婆给你说,其实我也没太搞明白,最近看了一篇文章我才理清了一点点思路,最近整日沉迷于肥宅快乐水,技术都跟不上了,来篇文章,提神醒脑,朝着我的富婆梦更近一步,早日走上富婆路,包养我家大狼狗!!! 为什么有模块概念...

    cod7ce 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<