详解JavaScript模板化使文章更清晰的全过程
作者:善良的小乔
一. 主要概念
什么是模板化?
一句话解释:模块化就是把一大段代码拆分成一个个小文件(模块),每个模块独立工作,互相协作。
为什么要用模块化?
想象一下你写了一个 3000 行的大项目代码,如果所有变量、函数都写在一个文件里,会发生什么?
变量命名冲突,逻辑难以维护,重用困难或者团队协作容易踩雷。
因此,使用模块化解决了这些问题,带来了:
作用域隔离:模块里的变量不会影响外部。
按需加载:只加载用到的模块。
更容易维护:每个文件职责清晰。
方便复用:模块可以在不同项目中复用。
模块的基本特性
一个模块通常具备以下特点:
特性 | 含义 |
---|---|
独立作用域 | 模块内部的变量不会影响其他模块 |
导出接口 | 模块暴露哪些内容给外部使用(如函数、常量) |
导入其他模块 | 模块可以引用别的模块的内容 |
二. 模块化的演变历史
1. 没有模块(最早)
<script> // 所有代码混在一个文件,全局变量污染严重 </script>
2. CommonJS(Node.js 专用)
// math.js function add(a, b) { return a + b; } module.exports = { add }; // main.js const math = require('./math'); console.log(math.add(2, 3)); // 5
特点:
同步加载模块(适用于服务器端)
require
、module.exports
3. AMD / RequireJS(早期浏览器模块)
define(['math'], function (math) { console.log(math.add(2, 3)); });
特点:
支持异步加载模块
用于浏览器早期阶段
4. ES Modules(现代浏览器和 Node.js 支持)
// math.js export function add(a, b) { return a + b; } // main.js import { add } from './math.js'; console.log(add(2, 3)); // 5
特点:
浏览器和 Node.js 都支持
支持静态分析、tree shaking、异步加载
三. 常用导入导出语法(ES Module)
命名导出
// math.js export const PI = 3.14; export function square(x) { return x * x; } // 使用 import { PI, square } from './math.js';
默认导出
// logger.js export default function log(msg) { console.log(msg); } // 使用 import log from './logger.js';
全部导入为命名空间
import * as utils from './math.js'; console.log(utils.square(4));
四. 示例
例题:构建一个模块化的计算器
题目描述:做一个简化版的模块化计算器项目,包含两个模块 + 一个主程序:
/calculator.js ← 数学计算模块 /logger.js ← 日志模块 /main.js ← 主程序模块
calculator.js
:导出基本的加减乘除函数
// calculator.js export function add(a, b) { return a + b; } export function subtract(a, b) { return a - b; } export function multiply(a, b) { return a * b; } export function divide(a, b) { return b !== 0 ? a / b : 'Cannot divide by zero'; }
logger.js
:导出默认的 log 函数
// logger.js export default function log(message) { console.log(`[Log] ${message}`); }
main.js
:导入并使用模块
// main.js import * as calc from './calculator.js'; import log from './logger.js'; const result = calc.multiply(4, 5); log(`4 x 5 = ${result}`); const result2 = calc.divide(10, 2); log(`10 ÷ 2 = ${result2}`);
详解
1. calculator.js
:命名导出
// calculator.js export function add(a, b) { ... } export function subtract(a, b) { ... } export function multiply(a, b) { ... } export function divide(a, b) { ... }
解释:
export function xxx
就是命名导出导出多个功能函数,调用时可以按需导入
2. logger.js
:默认导出
// logger.js export default function log(message) { console.log(`[Log] ${message}`); }
解释:
export default
表示这是模块的默认输出一个模块只能有一个
default export
默认导出在导入时可以重命名
3. main.js
:导入模块并使用
import * as calc from './calculator.js'; import log from './logger.js'; const result = calc.multiply(4, 5); log(`4 x 5 = ${result}`);
解释:
import * as calc from './calculator.js'
表示把所有命名导出聚合成一个对象
calc
使用时通过
calc.add()
这样的方式调用
import log from './logger.js'
这是导入默认导出,不需要加花括号
名字可以自定义(默认导出 ≠ 名字必须叫 log)
模块导入导出方式总结
五. 总结
1. 模块是为了隔离作用域、组织代码
2.export
是导出,import
是导入
3. 命名导出可以多个,默认导出只有一个
4. 导入时你可以选择单独导入或整体打包成命名空间
以上就是详解JavaScript模板化使文章更清晰的全过程的详细内容,更多关于JavaScript模板化过程的资料请关注脚本之家其它相关文章!