Js模块化

博客介绍了用闭包构造模块的方法,还阐述了多种JavaScript模块化规范。如服务器端的CommonJS,有同步加载缺陷;浏览器端的AMD,采用异步加载;CMD实现按需加载;UMD是CommonJS和AMD的结合。此外,还说明了ES6模块化特点及AMD和CMD的区别。

可以用闭包来构造模块,隐藏私有属性和方法,暴露公有属性和方法。这样 就形成了一个模块。
在模块化规范有commonjs,AMD,CMD,UMD, ES6
1.commonjs,是服务器端的规范,用到的是同步加载。 commonjs是主要为了js在后端的表现制定的,他是不适合前端的!nodejs用的就是commonjs规范
那么commonjs也是有缺陷的。require引入的模块是同步的,由于浏览器环境下,js都是通过script标签引入的,而这是异步的,因此conmmonjs在浏览器环境下无法正常加载
2.AMD(异步模块定义),是一个浏览器端模块化开发的规范。用到的是异步加载。requirejs框架用的就是AMD规范。
AMD模块中所有的依赖都前置, 其模块是异步的, 该自定义的模块内用到的模块均等到异步加载完成之后才调用响应模块, 这样浏览器不会失去响应。require指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题
3.CMD(同步模块定义)跟AMD的区别是实现了按需加载。seajs使用了CMD规范
4.UMD commonjs和AMD的结合。
UMD模块其实就是在当前JS执行环境中对以上几种模块规范定义的define, module.exports等进行判断, 同一模块根据不同场所返回不同结果。
ES6的模块化的基本规则或特点:
1、每一个模块只加载一次, 每一个JS只执行一次, 如果下次再去加载同目录下同文件,直接从内存中读取。 一个模块就是一个单例,或者说就是一个对象;
2、每一个模块内声明的变量都是局部变量, 不会污染全局作用域;
3、模块内部的变量或者函数可以通过export导出;
4.一个模块可以导入别的模块

AMD和CMD的区别
1.AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块,CMD`推崇就近依赖,只有在用到某个模块的时候再去require
2.两个都是定义的全局define函数来定义模块, define接收函数function(require, exports, module)保持一致
3.CMD是懒加载, 仅在require时才会加载模块; AMD是预加载, 在定义模块时就提前加载好所有依赖
4.CMD保留了CommonJS风格

### JavaScript 模块化的实现方式:ES6 与 CommonJS JavaScript 的模块化开发是现代前端和后端开发的重要组成部分。以下是 ES6 和 CommonJS 的主要实现方式及其特点。 #### 1. **CommonJS 模块化实现** CommonJS 是一种服务器端模块规范,主要用于 Node.js 环境中。它的核心思想是通过同步的方式加载模块,并使用 `require` 函数导入模块,通过 `module.exports` 或 `exports` 导出模块的功能[^2]。 - **导出模块** 使用 `module.exports` 或 `exports` 对象来导出模块内容。例如: ```javascript // modSecond.js let names = 'Second'; function funShowName() { console.log(names); } function funHarm() { console.log('Second harm people'); } exports.names = names; exports.funShowName = funShowName; exports.funHarm = funHarm; ``` - **导入模块** 使用 `require` 函数导入模块。例如: ```javascript // index.js const mod = require('./modSecond'); mod.funShowName(); mod.funHarm(); console.log(mod); ``` CommonJS 的特点是简单易用,但在浏览器环境中无法直接运行,需要借助工具(如 Webpack、Babel)进行打包和转译[^3]。 #### 2. **ES6 模块化实现** ES6 模块化是 JavaScript 的官方标准,支持在浏览器和 Node.js 中直接使用。它提供了更灵活的语法和更强大的功能,包括静态分析和按需加载[^1]。 - **导出模块** 使用 `export` 关键字导出模块内容。例如: ```javascript // math.js export const add = (a, b) => a + b; export const subtract = (a, b) => a - b; ``` - **默认导出** 可以使用 `export default` 导出一个默认值。例如: ```javascript // greet.js export default function greet(name) { return `Hello, ${name}`; } ``` - **导入模块** 使用 `import` 语句导入模块内容。例如: ```javascript // app.js import { add, subtract } from './math.js'; console.log(add(5, 3)); // 输出 8 console.log(subtract(5, 3)); // 输出 2 import greet from './greet.js'; console.log(greet('Alice')); // 输出 "Hello, Alice" ``` ES6 模块的优势在于其静态特性,允许工具在编译时解析依赖关系,从而优化代码结构和性能[^1]。 #### 3. **实际应用中的选择** 在实际开发中,选择哪种模块化方式取决于具体的环境和需求。如果是在 Node.js 环境中开发服务器端应用,CommonJS 是一个成熟且广泛使用的选项。而在现代浏览器环境中,ES6 模块更为常用,因为它符合未来的 JavaScript 标准。 对于需要兼容多种环境的项目,可以结合工具(如 Babel)将 ES6 模块转换为 CommonJS 模块,以确保在旧版浏览器或特定环境中正常运行。 ```javascript // 使用 Babel 转换 ES6 模块为 CommonJS 模块 // 配置 .babelrc 文件 { "presets": ["@babel/preset-env"], "plugins": ["@babel/plugin-transform-modules-commonjs"] } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值