当前位置:首页 > 日记 > 正文

import与export在node.js中的使用详解

import与export在node.js中的使用详解

简述

import与export是es6中模块化的导入与导出,node.js现阶段不支持,需要通过babel进行编译,使其变成node.js的模块化代码。(关于node.js模块,可参考其他node.js模块化的文章)

export 曝露

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

//写法1export var foo=function(){  console.log(1);}//写法2var bar ={a:"1",b:2};export {bar};//写法3var baz='hello world';export {baz as qux};

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

"use strict";//标记这个模块是es的模块Object.defineProperty(exports, "__esModule", {  value: true});//写法1var foo = exports.foo = function foo() {  console.log(1);};//写法2var bar = { a: "1", b: 2 };exports.bar = bar;//写法3var 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.jsexport * from './1';export * from './2';

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

总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关文章

ppt2010电脑版怎么安装动画大师

ppt2010电脑版怎么安装动画大师

动画,安装,步骤,大师,电脑软件,  为了方便我们在ppt中对动画的制作,我们可以在ppt中安装动画大师,那么,你知道怎样在ppt中安装动画大师吗?下面就让小编告诉你 如何在ppt中安装动画大师的方法,希望看完本教程的朋友都能学会并运用起来。在ppt…

在PPT2007中怎么对多个对象同时执

在PPT2007中怎么对多个对象同时执

对象,执行,多个,动作,中对,  在制作PPT演示文稿中,经常会需要对一张幻灯片中的多个对象同时执行一个动作,那么怎么在PPT2007中实现这一功能呢?以下是小编为您带来的关于在PPT2007中对多个对象同时执行一个动作,希望对您有所帮助。在PPT2007…

关于php 高并发解决的一点思路

关于php 高并发解决的一点思路

高并发,思路,电脑软件,php,我的思路如下(伪代码):sql1:查询商品库存if(库存数量 > 0){//生成订单...sql2:同时库存-1}当没有并发时,上面的流程看起来是再正常不过了,假设同时两个人下单,而库存只有1个了,在sql1阶段两个人查询到的库存都是>0的,于…

Javascript调试之console对象——

Javascript调试之console对象——

调试,对象,你不知道,小技巧,电脑软件,前言写过前端Javascript代码的同学肯定不会对console对象感到陌生,在调试的过程中我们经常会用console对象在控制台输出一些常量或者变量。但是相信很多人也就只用过console.log()这一个方法,今天我们就…

Excel怎样设置输入数据自动变成数

Excel怎样设置输入数据自动变成数

输入,设置,数据,方法,数值,  在Excel编辑的时候,在添加数据后自动变成了日期,怎么修改?在Excel中,可以通过设置禁止将数据转换为日期。接下来小编举例简单的例子告诉大家Excel如何设置输入数据自动变成数字。Excel设置输入数据自动变成数值…

excel表格的筛选教程

excel表格的筛选教程

教程,筛选,表格,电脑软件,excel,  Excel的筛选功能如何筛选数据呢?接下来是小编为大家带来的excel表格的筛选教程,供大家参考。excel表格的筛选教程:  筛选步骤1:比如我们建立有三列数据的Excel表来进行说明,分别是商品类别、商品名称和商…

AI基础教程:手把手教你绘制萌萌的

AI基础教程:手把手教你绘制萌萌的

绘制,驯鹿,插画,基础教程,手把手教你,效果图:主要过程:12 3 4 5 阅读全文1 23 4 5 阅读全文1 2 34 5 阅读全文1 2 3 45 阅读全文教程结束,以上就是AI基础教程:手把手教你绘制萌萌的小驯鹿插画的全部内容,希望大家喜欢!相关教程推荐:Illustrat…

jquery 一键复制到剪切板的实例

jquery 一键复制到剪切板的实例

剪切板,一键,实例,电脑软件,jquery,今天做项目有一个功能,通过点击事件复制一段文本到剪切板,在网上找了一些,整理了一下,方便需要的朋友使用。<a id="copy" data-text="123456">复制文本</a>$(function(){ var clipboard = new Clipboa…

微信小程序-获得用户输入内容

微信小程序-获得用户输入内容

输入,用户,程序,内容,电脑软件,在微信小程序里,如何获得用户输入的内容??js: document.getElementById("Content").valuejq:$("#Content").val()在微信小程序中并不能这样写。可以通过组件的属性 bindchange 将用户输入的储存存起来test.wxm…

AngularJS实现上传和预览功能的方

AngularJS实现上传和预览功能的方

方法,上传,功能,电脑软件,AngularJS,本文实例讲述了AngularJS实现图片上传和预览功能的方法。分享给大家供大家参考,具体如下:html5原生方法先看一下html5原生方法上传和预览图片的实现:// <img id="img-preview">var imgPreview = document…

ps背景图层和普通图层怎么互相转换

ps背景图层和普通图层怎么互相转换

背景图层,转换,图层,电脑软件,ps,PS中,怎样把背景图层转换成普通图层呢?普通图层又如何转换成背景图层?下面,小编一 一说下操作方法。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-04在操作界面右下方,这里显…

WPS表格怎么添加下拉列表WPS表格添

WPS表格怎么添加下拉列表WPS表格添

下拉列表,方法,下拉菜单,步骤,表格,  如何在WPS中添加下拉列表呢?通过使用下拉列表,可以更加方便的选择已知项,简各类选择操作。下面小编教你WPS表格怎么添加下拉列表。希望对你有帮助!WPS表格添加下拉列表的步骤首先,在WPS表格中输入要使用…