模块化开发

本文详细探讨了JavaScript模块化的概念及其演变过程,从早期的文件划分、命名空间到IIFE,再到CommonJS和AMD规范。重点介绍了ES Modules的特性、导出与导入的规则,并探讨了其在浏览器和Node.js环境中的应用及兼容性问题。最后提出了Babel作为ES Modules的兼容方案。
摘要由CSDN通过智能技术生成

一、模块化概念

模块化 只是一个思想
内容概要:

  • 模块化演变过程
  • 模块化规范
  • 常用的模块化打包工具
  • 基于模块化工具构建现代 Web 应用
  • 打包工具的优化技巧

二、模块化演变过程

  • Stage 1 - 文件划分发生
    基于文件的划分模块的方式
    问题:

    • 污染全局作用域
    • 命名冲突问题
    • 无法管理模块依赖关系
      这种早期模块化完全依靠约定
  • Stage 2 - 命名空间方式(所有模块成员都挂载在这个对象下面)
    每个模块只暴露一个全局对象,所有模块成员都挂载到这个对象中
    问题:

    • 模块成员在外部仍然可以被访问被修改
    • 模块之间的依赖关系也没有得到解决
  • Stage 3 - IIFE(使用立即执行函数的方式提供私有空间)
    使用立即执行函数表达式(IIFE: Immediately-Invoked Function Expression)为模块提供私有空间

以上这三种是早期在没有工具和规范的情况下 对模块化的落地方式

三、模块化规范的出现

上面三个阶段都是通过script 标签手动引入每个用到的模块,这也意味着模块的加载不受代码的控制,一旦时间久后维护起来就很困难,例如:代码中依赖于一个模块在HTML中忘记引用这个模块会有问题,在代码中移除了某个模块的引用,忘记在HTML中移除也会有问题
所以需要一些基础代码自动帮忙加载一些代码,就是说需要的是
模块化标准 + 模块化加载器
模块化规范: CommonJS 规范
CommonJS 规范:

  • 一个文件就是一个模块
  • 每个模块都有单独的作用域
  • 通过 module.exports 导出成员
  • 通过 require 函数载入模块

CommonJS 是以同步模式加载模块

结合浏览器重新设计了一套规范:
AMD(Asynchronous Module Definition)
推出了 Require.js
一个 define 函数
在这里插入图片描述还有 require 函数
在这里插入图片描述
目前绝大多数第三方库都支持 AMD 规范

  • AMD 使用起来相对复杂
  • 模块 JS 文件请求频繁

同期 还有淘宝推出的
Sea.js + CMD
在这里插入图片描述

四、模块化标准规范

浏览器 用 ES Modules , nodejs 用 CommonJS

在这里插入图片描述CommonJS in nodejs 没有问题
ES Modules in Browers:
ES 是 ECMAScript 2015 (ES6) , 会存在兼容问题

五、ES Modules 特性

1、语法特性

通过给 script 添加 type = module 的属性,就可以以 ES Module 的标准执行其中的 JS 代码了

<script type="module">
		console.log('this is es module')	// this is es module
	</script>

1、 ESM 自动采用严格模式,忽略 ‘use strict’

<script type="module">
		console.log(this)	// undefined
	</script>

2、 每个 ES Module 都是运行在私有作用域中

<script type="module">
		var foo  = 100
		console.log(foo)	// 100
	</script>
	<script type="module">
		console.log(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值