简历
导入导出是es6中的模块化导入导出,目前node.js不支持,需要通过babel进行编译,使其成为node.js的模块化代码.(关于node.js模块,请参考其他关于node.js模块化的文章)
出口风险
使用导出来公开方法、对象、字符串等。如下所示
//write 1 export var foo=function(){ console . log(1);}//写成2var bar={a:'1 ',b :2 };导出{ bar };//写3var baz=' hello world将{ baz }导出为qux然后,上面的代码被babel编译后,就变成了可执行的node.js代码,如下所示
使用“严格”;//将此模块标记为es的module object . define property(exports,' _ _ esmodule ',{ value : true });//写入1 var foo=exports . foo=function foo(){ console . log(1);};//写成2var bar={a: '1 ',b : 2 };exports.bar=bar//写3var baz=' hello worldexports.qux=baz看到上面的代码,我们知道es6的导出会转换成node.js中导出的暴露模式
导入导入
我们来看看进口的写法。我们引入文件xx.js,上面写着导出
第一种写作方式
从导入{foo,qux}。/xx ';console . log(qux);Foo、qux是xx.js中公开的属性,xx.js中公开了三个属性,分别是foo、bar和qux。因此,这种编写方法需要知道导入文件中公开的属性的名称,并且可以根据需要编写,而无需枚举所有属性。
让我们来看看巴贝尔的编译代码:
使用“严格”;var _=require('。/xx’);console.log(_。qux);这是一个简单的require方法,引入了xx.js,所以我们可以这样引入es6模块或者node.js模块。
第二种写作方式
将*作为xx从'导入。/xx ';console . log(xx . bar);这里介绍xx.js。这种编写方式会将xx.js中公开的所有属性分配给变量xx(实际上,它会给module.exports一个单独的名称),它将由babel编译如下:
使用“严格”;var _=require('。/xx’);var xx=_ interoprequireildcard(_);function _ interoprequireduildcard(obj){//确定它是节点模块还是es模块if (objobjobj。_ _ es module){ return obj;} else { var newObj={ }如果(obj!=null){ for(obj中的var键){ if(object . prototype . hasown property . call(obj,key))new obj[key]=obj[key];} }//兼容旧的babel编译newObj.default=objconsole . log(NewObj);返回newObj} } console . log(xx . bar);看到上面的代码,有一个判断是节点模块还是es模块,这个写法也是兼容es模块和节点模块的。
第三种写作方式
从“”导入oo。/xx ' console . log(oo . bar);Oo在这篇写作中是一个随机变量,乍一看可能和第二篇写作感觉一样,其实不然。让我们看看编译后的代码:
使用“严格”;var _=require('。/xx’);var _ 2=_ interopRequireDefault(_);function _ interoprequireddefault(obj){ return obj obj。__esModule?obj : { default : obj };} console . log(_ 2 . default . bar);最后一行oo.bar编译成_2.default.bar,又多了一个default,所以这里的bar找不到了,所以这个用法不是用来介绍export的属性,而是下面的export default。
导出默认风险和一次性风险
我将在其他文章中总结导出和导出默认值。这里我们只讨论导出默认值的用法。让我们看看下面的代码。
var foo=123导出默认foo由巴别塔编译,
使用“严格”;Object.defineProperty(导出,' __esModule ',{ value : true });var foo=123exports.default=foo请注意,最后一行中的foo将被分配给exports.default,这对应于从'中写入import oo。/xx ’,它在默认情况下调用属性,所以这两种用法对应使用。由于属性值被分配给exports.default,因此可以按如下方式使用它
导出默认值123;导出默认值{ foo :123 };上述导出默认函数f () {} exportdefault函数(){}的代码是单独编写的,因为export default在一个js中只能使用一次。原因和使用module.exports一样,只是不能写多个,下面也是错误的:
导出默认var foo=123//错误导出默认值也可以用来公开类。这里就不多说了,都是曝光。
其他一些用法
继承
这就是模块继承,实际上,一个父模块引入一个子模块,然后暴露子模块暴露的属性:
'导出* from '。/xx ';被编译后
使用“严格”;Object.defineProperty(导出,' __esModule ',{ value : true });var _=require('。/xx’);Object.keys(_)。forEach(function(key){ if(key==' default ' | | key==' _ _ esModule ')返回;object . defineperOperty(exports,key,{ enumerable: true,get : function get(){ return _[key];} });});注意下面的句子
if(key===' default ' | | key==' _ _ esModule ')返回;默认属性不对外公开.这表明在我们导入的xx.js文件中使用exports default是无效的。另一种写作方式是
从“”导出{default}。/xx ';继承通常用于组织多个模块,并且通常与下面将要描述的包一起使用
销售线索文件夹(销售线索包)
很多人不理解这一行代码
导入*从开始。/oo ';//oo是一个文件。为什么可以将导入引入文件夹?请注意,它不是一个文件夹。其中至少有一个文件是index.js或具有另一个名称的package.json和js。因为文件夹中有index.js,所以它不是一个文件夹,而是node.js的一个包(详见node.js包一文)。导入将由babel编译成require,并且require可以引用具有指定路径的包。因此,import可以导入一个文件夹,我们可以依靠index.js来导出文件夹中的其他文件代码,例如:
//index.jsexport * from '。/1';'导出* from '。/2';我们可以通过文件夹导入oo获取1.js和2.js中公开的属性。
摘要
查看babel的编译代码,我们可以看到export类似于export,和module。导出类似于导出默认值。至于用什么,就看个人喜好了。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。