Open chenyinkai opened 6 years ago
什么是模块化?
随着代码复杂程度的提高, 项目也变得越来越难维护, JavaScript模块化 也因此油然而生, 本文主要介绍 JavaScript模块化 的一些发展历程。
JavaScript模块化
这应该是大家最熟悉的一种加载方式, 但是缺点也比较明显
main.js
jquery
<script src="jquery.js"></script> <script src="jquery_scroller.js"></script> <script src="bootstarp.js"></script> <script src="main.js"></script>
一个文件就是一个模块, 其内部定义的变量, 方法都处于该模块内, 不会对外暴露.
主要语法:
require
exports
module.exports
a.js
name
sayHello
// a.js const name = 'Bob' function sayHello(name) { console.log(`Hello ${name}`) } module.exports.name = name module.exports.sayHello = sayHello
b.js
a
// b.js const a = require('./a') const name = a.name console.log(name) // Bob a.sayHello(name) // Hello Bob
由于 CommonJs 是同步加载的模块的, 在服务端(node), 文件都在硬盘上, 所以同步加载也无所谓, 但是在浏览器端, 同步加载就体验不好了. 所以 CommonJs 主要使用于 node 环境下.
CommonJs
node
AMD 全称为 Asynchromous Module Definition(异步模块定义), 实现了异步加载模块. require.js 实现了 AMD 规范
AMD
Asynchromous Module Definition(异步模块定义)
require.js
require([module], callback) // 导入 define(id, [depends], callback) // 导出模块
define(function() { let alertName = function(str) { alert('I am ' + str) } let alertAge = function(num) { alert('I am ' + num + ' years old') } return { alertName: alertName, alertAge: alertAge } })
test.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <script src="./require.js"></script> <script> require(['a'], function (alert) { alert.alertName('JohnZhu') alert.alertAge(21) }) </script> </body> </html>
能够异步加载模块, 适合在浏览器中运行, 但是不能够按需加载, 必须提前加载模块
CMD规范 是阿里的玉伯提出, sea.js 实现。 实现了按需加载
CMD规范
sea.js
与 AMD 的区别:
CMD
// AMD define(['./a', './b'], function(a, b) { a.doSomething() b.doSomething() }) // CMD define(function(require, exports, module) { var a = require('./a') a.doSomething() var b = require('./b') b.doSomething() })
ES6 模块化方案是最规范的方案, 未来也是主流, 对于我们来说也是经常使用与熟悉的. 不过现在的浏览器还不兼容, 使用需要 babel 转码
ES6
babel
export
import
import Vue from 'vue' import axios from 'axios' import { mapState, mapMutations, mapActions } from 'vuex' export default { created() { console.log('Hello World') } }
http://www.hangge.com/blog/cache/detail_1686.html https://www.imooc.com/article/20057
谈谈 javaScript 的模块化
随着代码复杂程度的提高, 项目也变得越来越难维护,
JavaScript模块化
也因此油然而生, 本文主要介绍JavaScript模块化
的一些发展历程。传统的开发
main.js
中有使用jquery
, 那么jquery
就一定要先加载, 但是从引入方式中我们无法直观的察觉依赖关系, 不利于维护CommonJs
主要语法:
require
来加载模块exports
或者module.exports
暴露模块中的内容demo
a.js
, 导出name
和sayHello
b.js
中引入a
并调用AMD
主要语法:
demo
a.js
, 输入以下内容test.html
中调用a
模块能够异步加载模块, 适合在浏览器中运行, 但是不能够按需加载, 必须提前加载模块
CMD
与
AMD
的区别:AMD
提前执行,而CMD
是延迟执行CMD
推崇依赖就近,AMD
推崇依赖前置ES6
export
导出模块import
导入模块参考
http://www.hangge.com/blog/cache/detail_1686.html https://www.imooc.com/article/20057