当前位置: 首页 > 科技观察

ES标准模块化规范概览及导入导出

时间:2023-03-11 21:59:13 科技观察

本文转载自微信公众号《Gogo的前端世界》,作者西岭。转载本文请联系Gogo前端世界公众号。ESStandardModularSpecification-Overview从历史上看,JavaScript没有模块系统,不可能将一个大程序拆分成相互依赖的小文件,并通过简单的方式将它们组装在一起。其他语言都有这个特性,比如Ruby的require,Python的import,甚至CSS都有@import,但是JavaScript对此没有任何支持,这给开发大型复杂项目带来了巨大的障碍。在ES6之前,社区开发了一些模块加载方案,最重要的是CommonJS和AMD。前者用于服务器,后者用于浏览器。ES6在语言标准层面实现了模块功能,实现起来相当简单。它可以完全替代CommonJS和AMD规范,成为浏览器和服务器的通用模块方案。ES6模块的设计思想是尽可能静态化,这样模块的依赖关系,以及输入输出变量都可以在编译时确定。CommonJS和AMD模块都只能在运行时确定这些东西。例如,CommonJS模块是对象,必须在输入时查找对象属性。模块是单个文件。文件内部的所有变量都无法从外部获得。如果想让外界能够读取模块内部的变量,就必须使用export关键字来导出变量。如果要从其他模块中导出内容,必须使用import来导入。导入导入的值不能重新赋值,尽管可以修改导入的对象和数组(导出的模块,以及任何其他导入,都会受此修改的影响)。在这种情况下,它们的行为类似于const声明。命名导入从源模块中导入具有原始名称的特定项目。从'./module.js'导入{something};从源模块导入特定项目并在导入时指定自定义名称。从'./module.js'导入{somethingassomethingElse};命名空间导入将源模块中的所有内容作为对象导入,将所有源模块的命名导出公开为属性和方法。默认导出被排除在该对象之外。importasmodulefrom'./module.js'上面的“something”示例将作为属性附加到导入对象。“模块。某事”。默认导入导入源文件的默认导出。从'./module.js'导入一些东西;EmptyImport加载模块代码,但不创建任何新对象。导入'./module.js';这对于polyfills很有用,或者当导入代码的主要目的与原型设计相关时。导出命名导出导出特定声明的值:varsomething=true;导出{某物};导出时重命名:export{somethingassomethingElse};声明后立即导出://这个可以和`var`,`let`,`const`,`class`,`function`一起使用exportvarsomething=true;默认导出(DefaultExport)导出一个值作为源模块的默认导出:exportdefaultsomething;建议在源模块只有一个导出时使用这种做法。在同一个模块中导出default和named是不好的,尽管它符合规范。