简述

import与export是es6中模块化的导入与导出,node.js现阶段不支持,需要通过babel进行编译,使其变成node.js的模块化代码。(关于node.js模块,可参考其他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的用法的相似,至于用什么怎么用还是看个人喜好吧。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# node
# import
# export
# nodejs
# JavaScript中使用import 和require打包后实现原理分析
# 一文让你彻底搞清楚javascript中的require、import与export
# Javascript(es2016) import和require用法和区别详解
# JavaScript ES6中export、import与export default的用法和区别
# JavaScript中import用法总结
# 多个
# 我们可以
# 第二种
# 有一个
# 都是
# 是个
# 是在
# 成了
# 还可以
# 由此可知
# 上了
# 不需要
# 说了
# 很多人
# 不多
# 其他的
# 会在
# 这就
# 在这种
# 再来
相关文章:
如何挑选高效建站主机与优质域名?
建站主机空间推荐 高性价比配置与快速部署方案解析
如何通过商城免费建站系统源码自定义网站主题?
如何在建站主机中优化服务器配置?
,网站推广常用方法?
如何用景安虚拟主机手机版绑定域名建站?
公司网站设计制作厂家,怎么创建自己的一个网站?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
英语简历制作免费网站推荐,如何将简历翻译成英文?
建站之星安装后如何配置SEO及设计样式?
建站之星如何一键生成手机站?
如何快速完成中国万网建站详细流程?
网站制作价目表怎么做,珍爱网婚介费用多少?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
C#怎么创建控制台应用 C# Console App项目创建方法
如何批量查询域名的建站时间记录?
建站主机SSH密钥生成步骤及常见问题解答?
南京网站制作费用,南京远驱官方网站?
如何快速搭建个人网站并优化SEO?
,交易猫的商品怎么发布到网站上去?
如何在西部数码注册域名并快速搭建网站?
广平建站公司哪家专业可靠?如何选择?
香港服务器租用每月最低只需15元?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
Swift开发中switch语句值绑定模式
Swift中switch语句区间和元组模式匹配
如何快速搭建高效可靠的建站解决方案?
如何通过IIS搭建网站并配置访问权限?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何在阿里云服务器自主搭建网站?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
Android自定义控件实现温度旋转按钮效果
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
宁波免费建站如何选择可靠模板与平台?
Python多线程使用规范_线程安全解析【教程】
建站之星伪静态规则如何设置?
高防服务器:AI智能防御DDoS攻击与数据安全保障
如何用wdcp快速搭建高效网站?
如何快速搭建高效服务器建站系统?
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何在万网ECS上快速搭建专属网站?
网站专业制作公司有哪些,做一个公司网站要多少钱?
开源网站制作软件,开源网站什么意思?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
安徽网站建设与外贸建站服务专业定制方案
全景视频制作网站有哪些,全景图怎么做成网页?
*请认真填写需求信息,我们会在24小时内与您取得联系。