?本篇文章给大家带来的内容是关于JavaScript中AMD和ES6模块导入导出的比较(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
本篇文章给大家带来的内容是关于JavaScript中AMD和ES6模块导入导出的比较(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 我们前端在开发过程中经常会遇到导入导出功能, import,export,export default import,export,export default属于ES6规范 import import 是在编译过程中执行 //import 路径不可以为变量 var url = './output' import { a, b } from url//这么写会报错 //------------------ //import 的引入与否不能和代码逻辑向关联 let status= true if(status){ import { a, b } from url//这么写会报错 } import可以使用as进行重命名 import foo from './output' import {b as B} from './output' import * as OBj from './output' import {a} from './output' import {b as BB} from './output' import c, {d} from './output' 导入的方式和导出有些关联,我们在下面说导出的时候,对以上这些导入方式进行逐一介绍 exoprt和export default将exoprt和export default放在一起,因为它们关联性很大 const a = 'valueA1' export {a} input.js import {a} from './output.js'//此处的import {a}和export {a},两个a是一一对应关系 console.log(a)//=>valueA1 留意上面的代码其中export {a}导出的a,和import {a}导入的a是同一个a const a = 'valueA1' export default{a} input.js import a from './output.js'//此处的a和export default{a},不是一个a, console.log(a)//=>{ a: 'valueA1' } 看下export default的栗子中的input.js,我们稍作改动 import abc from './output.js'//此处的a和export default{a},不是一个a, console.log(abc)//=>{ a: 'valueA1' } 我们做了些改动,但是输出没有变化,import导入的是export default下的对象,叫什么名字都可以,因为只会存在一个export default exoprt和export default混合使用exoprt和export default在同一个模块中同时使用,是支持的,虽然我们一般不会这么做 const a = 'valueA1' const b = 'valueB1' const c = 'valueC1' const d = 'valueD1' function foo() { console.log(`foo执行,c的值是${c}`); } export {a} export {b} export default { b,d,foo} input.js import obj, {a,b } from './output' console.log(a); //=>valueA1 console.log(b); //=>valueB1 console.log(obj); //=>{ b: 'valueB1', d: 'valueD1', foo: [Function: foo] } as 重命名通过 exoprt和export default导出的在import引入时都支持通过as进行重命名 const a = 'valueA1' const b = 'valueB1' const c = 'valueC1' const d = 'valueD1' function foo() { console.log(`foo执行,c的值是${c}`); } export {a} export {b} export default { b,d,foo} input.js import {a as A} from './output' import {* as A} from './output'//这是不支持的 import * as obj from './output' console.log(A); //=>valueA1 console.log(obj); //=>{ a: 'valueA1',default: { b: 'valueB1', d: 'valueD1', foo: [Function: foo] },b: 'valueB1' } as后面的变量是你要在input.js中使用的 import {* as A} from './output'//这是不支持的 import * as obj from './output' console.log(obj); //=>{ a: 'valueA1',default: { b: 'valueB1', d: 'valueD1', foo: [Function: foo] },b: 'valueB1' }
我们之前说import{}和export{},是一一对应关系,所以在export导出的,在import{}不支持使用* require,exports,module.exports(记得后面的s)这是 AMD规范 requirerequire是运行时调用,所以require理论上可以运用在代码的任何地方 require支持动态引入例如,这样是支持的 let flag = true if (flag) { const a = require('./output.js') console.log(a); //支持 } require路径支持变量let flag = true let url = './output.js' if (flag) { const a = require(url) console.log(a); //支持 } 通过require引入,是一个赋值的过程 exports 与 module.exports根据AMD规范 为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。 const exports = module.exports; 所以说 exports.a ='valueA1' module.exports.a='valueA1' 前面说在每个模块提供一个exports变量,指向module.exports。 const exports = module.exports; 直接给exports赋值会切断exports和 module.exports的关联关系 const a = 'valueA1' const b = 'valueB1' const c = 'valueC1' module.exports = { c} exports.b = b//当直接给 module.exports时,exports会失效 module.exports.a = a input.js const obj = require('./output.js') console.log(obj); //=>{ c: 'valueC1', a: 'valueA1' } 继续看代码 //部分省略 exports.b = b//这样可以生效 module.exports.a = a input.js const obj = require('./output.js') console.log(obj); //=>{ b: 'valueB1', a: 'valueA1' } 再看一段代码 //部分省略 module.exports = { c} module.exports.a = a input.js const obj = require('./output.js') console.log(obj); //=>{ c: 'valueC1', a: 'valueA1' } 当直接给 module.exports时,exports会失效 交叉使用在ES6中export default 导出的是一个对象 demo1output.js //部分省略 module.exports = { c} module.exports.a = a inputj.s import obj from './output' import {a} from './output' console.log(a);//=>valueA1 console.log(obj);//=>{ c: 'valueC1', a: 'valueA1' } demo2output.js const a = 'valueA1' const b = 'valueB1' const c = 'valueC1' function foo() { console.log(`foo执行,c的值是${c}`); } export {a} export default {b,c,foo} export {b} input.js const a = require('./output.js') console.log(a); //=>{ a: 'valueA1',default: { b: 'valueB1', c: 'valueC1', foo: [Function: foo] }, b: 'valueB1' } 总结
本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的JavaScript视频教程栏目! 以上就是JavaScript中AMD和ES6模块导入导出的比较(代码示例)的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |