随着应用的复杂度越来越高,其代码量和文件数据都会急剧增加,会逐渐引发一些问题:
模块化的核心思想就是:模块之间是相互隔离的,通过导入和导出进行数据和功能共享。
// school.js
const name = "JavaScript";
const slogan = "让天下没有难学的技术";
function getTel() {
return "13888888888";
}
function getCities() {
return ["北京", "上海", "广州", "深圳"];
}
// 第一种
exports.name = name;
exports.slogan = slogan;
exports.getTel = getTel;
// 第二种
module.exports = {
name: name,
slogan: slogan,
getTel: getTel,
};
注意点:
每个模块内部的 this
, exports
, modules.exports
在初始时,都指向同一个空对象,该空对象就是当前模块导出的数据
无论如何修改导出对象,最终导出的都是 module.exports
对象.
exports
是对 module.exports
的初始引用,仅为了给导出对象添加属性,多疑不能使用 exports = value
的形式导出数据,但是可以使用 module.exports = value
的形式导出数据。
// index.js
// const school = require("./school");
// console.log(school);
// 解构
const { name, slogan, getTel } = require("./school");
// 解构重命名
const { name: stuName, motto, getTel: stuTel } = require("./student");
console.log(name); // "JavaScript"
console.log(slogan); // "让天下没有难学的技术"
console.log(getTel()); // "13888888888"
consol.log(stuName); // "张三"
console.log(motto); // "学而不思则罔,思而不学则殆"
console.log(stuTel()); // "13999999999"
一个 JS 模块在执行时,是被包裹在一个内置函数中执行的,所以每个模块都有自己的作用域,我们可以通过如下方式验证这一说法
console.log(arguments);
console.log(arguments.callee.toString());
内置函数的形式
(function (exports, require, module, __filename, __dirname) {
// 模块代码
});
node.js 默认是支持 CommonJS 模块化规范的,但浏览器不支持,所以需要经过编译,步骤如下:
browserify
npm install -g browserify
browserify index.js -o bundle.js
备注:index.js 是源文件,bundle.js 是输出的目标文件
<script src="bundle.js">script>
ES6 模块化规范是一个官方标准的规范,它是在语言标准的层面上实现了模块化功能,是目前最流行的模块化规范,且在浏览器和 NodeJS 中都可以运行。
查看 5_ES6模块化规范
案例
修改文件后缀名 .mjs
添加 package.json
文件
{
"type": "module"
}
// school.js
export const name = "JavaScript";
export const slogan = "让天下没有难学的技术";
// school.js
const name = "JavaScript";
const slogan = "让天下没有难学的技术";
export { name, slogan };
// school.js
const name = "JavaScript";
const slogan = "让天下没有难学的技术";
export default name;
上述多种导出方法可以同时使用
// index.js
import * as school from "./school";
console.log(school);
// index.js
import { name, slogan } from "./school";
console.log(name); // "JavaScript"
console.log(slogan); // "让天下没有难学的技术"
// index.js
import school from "./school";
console.log(school); // "JavaScript"
// index.js
import school, { name, slogan } from "./school";
console.log(school); // "JavaScript"
console.log(name); // "JavaScript"
console.log(slogan); // "让天下没有难学的技术"
// index.js
if (Math.random() > 0.5) {
import("./school").then((school) => {
console.log(school);
});
} else {
import("./student").then((student) => {
console.log(student);
});
}
const btn = document.getElementById("btn");
btn.onclick = async () => {
const result = await import("./student.js");
console.log(result);
};
import
可以不接受任何数据