import与export是es6中模块化的导入与导出,node.js现阶段不支持,需要通过babel进行编译,使其变成node.js的模块化代码。(关于node.js模块,可参考其他node.js模块化的文章)本文主要介绍import与export在node.js中的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

export 曝露

使用export可以曝露出方法、对象、字符串等等,如下代码

//写法1

export var foo=function(){

console.log(1);

}

//写法2

var bar ={a:"1",b:2};

export {bar};

//写法3

var baz='hello world';

export {baz as qux};

那么,上面的代码经过babel的编译后,变成可以执行的node.js代码,如下

"use strict";

//标记这个模块是es的模块

Object.defineProperty(exports, "__esModule", {

value: true

});

//写法1

var foo = exports.foo = function foo() {

console.log(1);

};

//写法2

var bar = { a: "1", b: 2 };

exports.bar = bar;

//写法3

var baz = 'hello world';

exports.qux = baz;

看到上面的代码我们知道了,es6的export会被转成node.js中的exports的曝露方式。

import 导入

再来看下import的写法,我们引入上面写export的文件xx.js

第一种写法

import {foo,qux} from './xx';

console.log(qux);

foo,qux是在xx.js中我们曝露出来的属性,在xx.js中曝露出来的属性有foo、bar、qux3个,由此可知这种写法需要知道引入文件中曝露出来的属性的名称,并且可以按需要写,不需要枚举全部属性。

下面我们来看下babel编译后的代码:

'use strict';

var _ = require('./xx');

console.log(_.qux);

就是一个简单的require方法,引入xx.js,所以用这种方式我们是可以引入es6的模块也可以引入node.js模块的。

第二种写法

import * as xx from './xx';

console.log(xx.bar);

这里还是引入xx.js,这种写法会把xx.js中曝露出来的属性都赋值给xx这个变量(其实就是给module.exports起个别名),被babel编译后如下下:

'use strict';

var _ = require('./xx');

var xx = _interopRequireWildcard(_);

function _interopRequireWildcard(obj) {

//判断是node模块还是es模块

if (obj && obj.__esModule) {

return obj;

}

else {

var newObj = {};

if (obj != null) {

for (var key in obj) {

if (Object.prototype.hasOwnProperty.call(obj, key))

newObj[key] = obj[key];

}

}

//兼容旧的babel编译

newObj.default = obj;

console.log(newObj);

return newObj;

}

}

console.log(xx.bar);

看到上面的代码,有一个判断是node模块还是es模块,这种写法也是兼容es模块和node的模块的。

第三种写法

import oo from './xx'

console.log(oo.bar);

在这种写法中oo是随意的变量,乍一看可能会觉的和第二种写法一样,其实不然,来看一下编译后的代码:

'use strict';

var _ = require('./xx');

var _2 = _interopRequireDefault(_);

function _interopRequireDefault(obj) {

return obj && obj.__esModule ? obj :

{ default: obj };

}

console.log(_2.default.bar);

在最后一行,oo.bar被编译成了_2.default.bar,多了一个default,这里的bar当然就找不到了,所以这种用法不是用来引入export的属性的,而是下面要说的export default。

export default 曝露且一次性曝露

export与export default我会在别的文章总结,这里我们只说export default的用法,下面来看代码。

var foo=123;

export default foo;

被babel编译后

"use strict";

Object.defineProperty(exports, "__esModule", {

value: true

});

var foo = 123;

exports.default = foo;

看到最后一行foo会被赋给exports.default,这样正好对应上了import oo from './xx'这种写法里面会调用default里面的属性,所以这两种用法对应使用。既然属性的值是会赋给exports.default,那么就可以有下面的用法

export default 123;

export default {foo:123};

export default function f(){}

export default function (){}

上面的代码是分开写的,因为一个js里面只能使用一次export default,理由和使用module.exports一样,除了不能写多个,下面也是错误的写法:

export default var foo=123; //错误

export default还可以用来曝露class这里不多说了,都是曝露。

其他的一些用法

继承

这里说是模块继承,其实就是一个父模块引入子模块,然后又将子模块曝露出来的属性曝露出去:

export * from './xx';

被编译后

'use strict';

Object.defineProperty(exports, "__esModule", {

value: true

});

var _ = require('./xx');

Object.keys(_).forEach(function (key) {

if (key === "default" || key === "__esModule") return;

Object.defineProperty(exports, key, {

enumerable: true,

get: function get() {

return _[key];

}

});

});

注意下面这句

if (key === "default" || key === "__esModule") return;

default属性不向外曝露...这说明,我们的引入的xx.js这个文件里面用exports default是无效的,替代写法是

export {default} from './xx';

继承的写法常用于组织多个模块,经常与下面要说的引包一起用

引文件夹(引包)

很多人不理解下面这行代码

import * as o from './oo'; //oo是个文件

为什么import可以引入文件夹,注意不是什么文件夹都可以,里面至少有一个文件就是index.js或者有package.json和另外名字的js,因为文件夹里面有index.js那么这就不是一个文件夹而是node.js的包了(更多参见node.js包的文章),import会被babel编译成require,require可以去引用指定路径的包,因此,import可以去导入一个文件夹,我们可以依赖index.js将文件夹中的其他文件代码导出,例如:

//index.js

export * from './1';

export * from './2';

我们可以通过import oo这个文件夹得到1.js、2.js里面曝露出的属性。

总结

从看babel编译后的代码,可以看出export与exports,module.exports与export default的用法的相似,至于用什么怎么用还是看个人喜好吧。

相关推荐:

import export php,import与export在node.js中的使用方法相关推荐

  1. 如何在Node.js中处理POST数据?

    如何提取Node.js中 HTTP POST方法发送的表单数据( form[method="post"] )和文件上传? 我已经阅读了文档,谷歌搜索并没有发现任何东西. funct ...

  2. node.js中模块_在Node.js中需要模块:您需要知道的一切

    node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...

  3. boa支持https_Boa: 在 Node.js 中使用 Python

    Hello,大家好,有一段时间不见了. 这次主要给大家带来一个好东西,它的主要用途就是能让大家在 Node.js 中使用 Python 的接口和函数.可能你看到这里会好奇,会疑惑,会不解,我 Node ...

  4. 如何在node.js中发出HTTP POST请求?

    如何在node.js中使用数据发出出站HTTP POST请求? #1楼 如果您使用请求库,这会变得更容易. var request = require('request');request.post( ...

  5. 在Node.js中,如何从其他文件中“包含”函数?

    假设我有一个名为app.js的文件. 很简单: var express = require('express'); var app = express.createServer(); app.set( ...

  6. 一道题学习node.js中的CRLF注入

    前言 这几天刷题遇到在node.js题目中注入CRLF实现ssrf的题目,对于我来说知识听新颖.在此记录一下. CRLF注入 学习过http请求走私漏洞的师傅对于这个CRLF肯定不会陌生.所谓的CRL ...

  7. 在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查

    Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),.它当前支持M ...

  8. node/js 漏洞_6个可用于检查Node.js中漏洞的工具

    node/js 漏洞 Vulnerabilities can exist in all products. The larger your software grows, the greater th ...

  9. node mongoose_如何使用Express,Mongoose和Socket.io在Node.js中构建实时聊天应用程序

    node mongoose by Arun Mathew Kurian 通过阿伦·马修·库里安(Arun Mathew Kurian) 如何使用Express,Mongoose和Socket.io在N ...

最新文章

  1. 求链式线性表的倒数第K项(堆栈解法)
  2. python入门基础代码图-python入门基础知识(代码)
  3. htc g12刷机的成功经验--只面向小白
  4. linux线程下的读写锁
  5. “并发用户数”、“系统用户数”和“同时在线用户数”的计算公式
  6. c语言流水灯小程序,流水灯小程序.doc
  7. php获取当前世界,php获取网站alexa世界流量排名代码
  8. LeetCode 264.丑数 II(动态规划)
  9. 简单桌面导航html win10,IT之家学院:让你的Win10桌面比macOS还简洁漂亮高大上
  10. step13. ubuntu18.04下载安装配置Hive(转)
  11. 安徽大学计算机专硕奖学金,2019年安徽大学新闻传播跨考华东师范大学计算机专硕,总分418,排名第一经验分享!...
  12. vmoptions默认配置_idea VM options参数优化
  13. matlab绘制roc曲线,手把手画ROC曲线
  14. 人艰不拆——记在工作一个半月之后
  15. qt 批量裁剪图片_照片变素描,不用下载App,好用的在线图片处理及图库
  16. NVIDIA NCCL 源码学习(一)- 初始化及ncclUniqueId的产生
  17. 天水市2021年高考成绩查询,2021年天水高考状元是谁分数多少分,历年天水高考状元名单...
  18. 白化病最新研究进展(2021年9月)
  19. VB.net学习笔记(二十九)认识STA与MTA
  20. js去除字符串中的所有空格(包括前后,中间存在的所有空格),清除前后空格(手机输入框实用),es6新方法

热门文章

  1. 3.3 集束搜索-深度学习第五课《序列模型》-Stanford吴恩达教授
  2. 【语音SBC算法】基于正交滤波器组的语音SBC算法设计与实现
  3. 拯救react的hooks:react的问题和hooks的作用
  4. HashMap的容量(桶的数量)为什么要是2的n次方
  5. POJ-1201 Intervals---差分约束
  6. Spring源码-AOP(六)-自动代理与DefaultAdvisorAutoProxyCreator
  7. [BZOJ4403]序列统计
  8. Linux文件管理以及一些常用的基础命令解析
  9. java多线程中的异常处理
  10. jquery 导航栏目