当前位置: 首页 > news >正文

ECMAScript Modules 规范示例详解

        ECMAScript 模块是 JavaScript 代码的一种封装形式,它允许开发者将代码分割成不同的文件,每个文件包含一组相关的函数和变量。这些文件可以单独加载和执行,而不会影响其他文件。ECMAScript 模块规范定义了如何在 JavaScript 程序中实现代码的模块化和封装。
        模块的定义
        一个 ECMAScript 模块是一个独立的文件,其中包含了可以导出(export)供其他模块使用的函数、对象、类等,以及可以导入(import)其他模块提供的功能的代码。模块文件通常具有 `.mjs`、`.js` 或 `.ts` 扩展名。
        模块语法
        导出(Export)
要导出模块中的内容,可以使用 `export` 关键字。有两种方式可以导出:
1. **默认导出**:

   export default function myFunction() {
     // 函数实现
   }

2. **命名导出**:
  
   export const myVariable = "Hello, World!";
   export function myFunction() {
     // 函数实现
   }

        导入(Import)
要导入模块中的内容,可以使用 `import` 关键字。有两种方式可以导入:
1. **默认导入**:
 
   import myFunction from './myModule.js';

2. **命名导入**:

   import { myVariable, myFunction } from './myModule.js';

        模块解析
当浏览器或 Node.js 解析模块时,它会遵循以下规则:
1. **相对导入**:从当前文件的目录开始查找。
2. **绝对导入**:从项目的根目录开始查找。
3. **扩展名省略**:如果未指定扩展名,浏览器和 Node.js 会在文件名后自动添加 `.js`。
        循环依赖
当一个模块导入另一个模块,而后者又导入了前者时,就形成了循环依赖。在 ES6 模块中,这种情况下,只有被多次导入的模块会被解析一次,其余的导入将视为同一个模块。
        模块加载
模块的加载可以通过多种方式实现:
1. **HTML 文件**:在 HTML 文件中,可以使用 `<script>` 标签加载模块,并设置 `type` 属性为 `module`。

   <script type="module" src="./myModule.js"></script>

2. **JavaScript 文件**:在 JavaScript 文件中,可以使用 `import` 语句加载模块。

   import { myVariable, myFunction } from './myModule.js';

3. **Node.js**:在 Node.js 中,可以使用 `require` 语句加载模块。

   const myModule = require('./myModule.js');

        模块缓存
为了提高性能,浏览器和 Node.js 会在本地缓存已加载的模块。这意味着一旦一个模块被加载,相同的模块在后续的页面加载中不会再次加载。
        示例
下面是一个简单的模块示例,展示了如何导出和导入函数:
        

// myModule.js
export const myVariable = "Hello, World!";
export function myFunction() {return "This is a function from myModule.";
}
// main.js
import { myVariable, myFunction } from './myModule.js';
console.log(myVariable); // 输出: Hello, World!
console.log(myFunction()); // 输出: This is a function from myModule.


        
在这个示例中,`myModule.js` 文件定义了两个可以被其他文件使用的变量和函数。然后,`main.js` 文件通过 `import` 语句导入 `myModule.js` 文件中的内容,并使用这些变量和函数。
        总结
        ECMAScript 模块为 JavaScript 提供了模块化和封装的能力,使得大型项目的开发变得更加容易。通过使用模块,开发者可以将代码分割成更小的、可管理的部分,从而提高代码的可维护性和可重用性。随着浏览器和 Node.js 对 ES6 模块的支持日益成熟,模块化开发已成为现代 JavaScript 开发的标准实践。

相关文章:

  • vue三种路由守卫详解
  • JDK、JRE、JVM三者关系详解
  • 当go get获取不到软件包时
  • 第六篇:MySQL图形化管理工具
  • 关于在分布式环境中RVN和使用场景的介绍3
  • Kafka集群安装与部署
  • 力扣-1. 两数之和
  • 华为问界M9:领跑未来智能交通的自动驾驶黑科技
  • ACK One Argo工作流:实现动态 Fan-out/Fan-in 任务编排
  • TinUI v5预发布记录
  • Javaweb之SpringBootWeb案例之propagation属性案例演示的详细解析
  • 使用C++从零开始,自己写一个MiniWeb
  • 贪心算法之找零钱
  • openJudge | 距离排序 C语言
  • OCP使用web console创建和构建应用
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • angular学习第一篇-----环境搭建
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • If…else
  • JavaScript对象详解
  • JS 面试题总结
  • Objective-C 中关联引用的概念
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 如何在 Tornado 中实现 Middleware
  • 使用 QuickBI 搭建酷炫可视化分析
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 译自由幺半群
  • 在Mac OS X上安装 Ruby运行环境
  • 字符串匹配基础上
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #pragma 指令
  • #stm32整理(一)flash读写
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (12)Linux 常见的三种进程状态
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (WSI分类)WSI分类文献小综述 2024
  • (二)WCF的Binding模型
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (六)c52学习之旅-独立按键
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .htaccess配置重写url引擎
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net 按比例显示图片的缩略图
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器