🍉ES6基础-用模块封装代码

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 🍉ES6基础-用模块封装代码

前言


JavaScript 用“共享一切”的方法加载代码,这是该语言中最容易出错且容易令人感到困惑的地方。随着 Web 应用变得更加复杂,JavaScript 代码的使用量也开始增长,这一做法会引起问题,如命名冲突和安全问题。ES6 的一个目标是解决作用域问题,也为了使 JS 应用程序显得有序,于是引进了模块。


1. 什么是模块


模块是自动运行在严格模式下并且没有办法退出运行的JavaScript代码。模块真正的魔力所在是仅导出和导入你需要绑定,而不是将所有东西都放到一个文件。只有很好地理解了导出和导入才能理解模块和脚本的区别。


2. 导出的基本语法


// 导出数据
export var color = "red";
// 导出函数
export function sum(a, b) {
  return a + b;
}
// 导出类
// 。。。
复制代码


任何未显示导出的变量、函数或类都是模块私有的,无法从模块外部访问。


3. 导入的基本语法


从模块中导出的功能可以通过 import 关键字在另一个模板中访问。


import { identifier1, identifier2 } from "./example.js";
复制代码


导入绑定的列表看起来与解构对象很相似,但不是。


导入单个绑定


不能给导入的绑定重新赋值


// 只导入一个
import { sum } from "./example.js";
console.log(sum(1, 2));
sum = 1; // 抛出一个错误
复制代码


为了更好地兼容多个浏览器和 Node.js 环境,一定要在字符串之前包含/、,/或../来表示要导入的文件。


导入多个绑定


import { sum1, sum2 } from "./example.js";
复制代码


导入整个模块


// 导入一切
import * as example from "./example.js";
复制代码


这种导入格式被称为命名空间导入(namespace import)

模块语法的限制


export语句不允许出现在if语句中,不能有条件导出或以任何方式动态导出。模块语法存在的一个原因是要让JavaScript引擎静态地确定哪些可以导出。


4. 导出和导入时重命名


导出重命名


function sum(a, b) {
  return a + b;
}
export { sum as add };
复制代码


导入重命名


import { add as sum } from "./example.js";
复制代码


5. 模块的默认值


导出默认值


export default function (a, b) {
  return a + b;
}
复制代码


function sum(a, b) {
  return a + b;
}
export default sum;
复制代码


导入默认值


不使用大括号,这种语法是最纯净的。


import sum from "./example.js";
复制代码


6. 重新导出一个绑定


import { sum } from "./example.js";
export { sum };
复制代码


你还可以这样写:


export { sum as add } from "./example.js";
复制代码


7. 无绑定导入


内建对象的共享定义可以在模块中访问,对这些对象所做的更改将反应在其他模块中

例如,要向所有数组添加 pushAll()方法。


Array.prototype.pushAll = function (items) {
  if (!Array.isArray(items)) {
    throw new TypeError("参数必须是一个数组。");
  }
  return this.push(...items);
};
复制代码


无绑定导入最有可能被应用于创建 Polyfill 和 Shim。


8.加载模块


ES6 并没有尝试为所有 JavaScript 环境一套统一的标准,它只规定了语法,并将加载机制抽象到一个未定义的内部方法 HostResolveImportModule 中。


在 Web 浏览器中使用模块


<script type="module" src="module.js"></script>
<script type="module">
  import { sum } from "./example.js";
  let result = sum(1, 2);
</script>
复制代码


Web 浏览器中模块加载顺序


<script>元素按照它们被引入的顺序加载。


Web 浏览器中异步模块加载


async 属性应用于脚本时,脚本文件将在文件完全下载并解析后执行。脚本在下载完成后立即执行,而不必等待包含的文档完成解析。


<!-- 无法保证这两个哪个先执行 -->
<script type="module" async src="module1.js"></script>
<script type="module" async src="module2.js"></script>
复制代码


两个文件都被异步加载,只是简单地看这个代码判断不出哪个模块先执行,原则是谁先加载完谁先执行。


将模块作为 Worker 加载


let worker = new Worker("module.js", { type: "module" });
复制代码


9. 浏览器模块说明符解析


浏览器说明符要求模块说明符具有以下几种格式之一:


  • 以/开头的解析为从根目录开始
  • 以./开头的解析为从当前目录开始
  • 以../开头的解析为从父目录开始
  • URL 格式


最后


⚽本文介绍了ES6中的模块,模块其实就是一种打包和封装功能的方式~

相关文章
|
3月前
|
JavaScript 前端开发 开发者
深入解析Angular装饰器:揭秘框架核心机制与应用——从基础用法到内部原理的全面教程
【8月更文挑战第31天】本文深入解析了Angular框架中的装饰器特性,包括其基本概念、使用方法及内部机制。装饰器作为TypeScript的关键特性,在Angular中用于定义组件、服务等。通过具体示例介绍了`@Component`和`@Injectable`装饰器的应用,展示了如何利用装饰器优化代码结构与依赖注入,帮助开发者构建高效、可维护的应用。
38 0
|
4月前
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
50 5
|
6月前
|
存储 JavaScript 前端开发
对象和类:JS是一种基于对象的语言,可以创建和使用自定义对象。ES6引入了类的概念,使得面向对象编程更加方便。
对象和类:JS是一种基于对象的语言,可以创建和使用自定义对象。ES6引入了类的概念,使得面向对象编程更加方便。
42 0
|
前端开发
前端学习案例4:ES6中的修饰器4
前端学习案例4:ES6中的修饰器4
61 0
前端学习案例4:ES6中的修饰器4
|
JavaScript 前端开发
🍉JavaScript进阶——类的本质及ES5的新增方法
🍉JavaScript进阶——类的本质及ES5的新增方法
91 9
🍉JavaScript进阶——类的本质及ES5的新增方法
|
前端开发
前端学习案例1:ES6中的修饰器1
前端学习案例1:ES6中的修饰器1
70 0
前端学习案例1:ES6中的修饰器1
|
前端开发
前端学习案例2:ES6中的修饰器2
前端学习案例2:ES6中的修饰器2
71 0
前端学习案例2:ES6中的修饰器2
|
前端开发
前端学习案例3:ES6中的修饰器3
前端学习案例3:ES6中的修饰器3
57 0
前端学习案例3:ES6中的修饰器3
|
前端开发
前端学习案例3-es6的模块化 原
前端学习案例3-es6的模块化 原
64 0
前端学习案例3-es6的模块化 原
|
JavaScript 前端开发 开发者
🍉ES6基础-改进的数组功能
🍉ES6基础-改进的数组功能
83 1
下一篇
无影云桌面