前端模块化
前端模块化
以前模块化的方式:
以前的方式可能出现的问题:
可能小红定义的全局变量覆盖了小明定义的全局变量,小明2中引用小明1的时候会导致数据紊乱,并且要保证执行正确,就要正确的顺序进行引用。
当然可以使用闭包的方式,但是如果用了闭包的方式,又不能访问小明1中的flag。
ES5的解决方法:
小明:
var moduleA = (function () { var obj = {} // 小明 var name = '小明' var age = 22 function sum (num1, num2) { return num1 + num2 } var flag = true if (flag) { console.log(sum(10, 20)); } obj.falg = flag obj.sum = sum return obj })()
(function(){ if ( moduleA.falg ) { console.log('小明是天才'); } console.log(moduleA.sum(1, 2)); })()
使用模块作为出口
- 常见的模块化规范:
- Common JS、AMD、CMD、也有ES6的Modules
CommonJS(了解)
-
模块化有两个核心:导出和导入
-
CommonJS的导出:
module.exports = { flag: true, test(a, b) { return a+b }, demo(a, b) { return a*b } }
- CommonJS的导入:
// CmmonJS模块 var {test, demo, flag} = require('moduleA'); // 等同于 var _mA = require('moduleA'); var test = _mA.test; var demo = _mA.demo; var flag = _mA.flag;
ES6模块化的导入和导出
export(导出)/import(导入)
index.html
<script src="aaa.js" type="module"></script> <script src="bbb.js" type="module"></script> <script src="mmm.js" type="module"></script>
aaa.js
var name = '小明' var age = 18 var flag = true function sum(num1, num2) { return num1 + num2 } if(flag) { console.log(sum(20, 30)); }
bbb.js
var name = '小红' var flag = false
mmm.js
if (flag) { console.log("小明是天才,哈哈哈哈"); }
执行结果:
- 因为每个JS文件作为一个模块,不能直接使用aaa中的flag
解决办法:
- 方式一:
// 在aaa.js最后加入 export { flag, sum } // 在mmm.js最前加入 import { flag, sum } from './aaa.js'
- 方式二:
// 定义时直接导出 export function add( num1, num2 ) { return num1 + num2 } export var num1 = 100 // 导入 import {flag, sum} from "./aaa.js"; import { num1, add } from "./aaa.js"; console.log(add(num1, 200));
- 导出类
export class Person { name; run() { console.log(this.name + '在奔跑'); } } import { Person } from "./bbb.js"; const person = new Person(); person.name = '刘翔' person.run()
- default
- 有时候我们不希望别人引用我们的名字,我只导出一个功能,调用者自己起名字
- 默认的只能有一个
const address = '北京市' export default address import addr from './aaa.js' ===================================== export default function( arg ) { console.log(arg); } import getName from './bbb.js' getName('你好啊')
- 统一全部导入
import * as info from './bbb.js' if( info.flag ) { console.log('Hello World') }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)