JavaScript模块管理的简单实现方式详解


Posted in Javascript onJune 15, 2019

1. 为什么会有这个东西?

方便组织你的代码,提高项目的可维护性。一个项目的可维护性高不高,也体现一个程序员的水平,在如今越来越复杂的前端项目,这一点尤为重要。

2. 为什么不用requirejs,seajs等

它们功能强大,但是文件体积是个问题,此外还有就是业务有时候可能没那么复杂,正如开头所说的:keep it simple

3. 以下的实现从哪里来的?

这些借鉴了requirejs,seajs,commonjs等的实现,用于真实的项目,稳定运行,效果不错。

4. 适用场景

移动端页面,将js注入到html页面,这样就不用考虑模块加载的问题,从而节省了很多的代码,在实现上也更为的简单。

如果是多文件加载的话,需要手动执行文件加载顺序,那么其实最好用库来进行依赖管理会好一点。

实现1

(function(global){
var modules = {};
var define = function (id,factory) {
if(!modules[id]){
modules[id] = {
id : id,
factory : factory
};
}
};
var require = function (id) {
var module = modules[id];
if(!module){
return;
}
if(!module.exports){
module.exports = {};
module.factory.call(module.exports,require,module.exports,module);
}
return module.exports;
}
global.define = define;
global.require = require;
})(this);

使用示例

define('Hello',function(require,exports,module){
function sayHello() {
console.log('hello modules');
}
module.exports = {
sayHello : sayHello
}
});
var Hello = require('Hello');
Hello.sayHello();

实现2

function Module(main,factory){
var modules = {};
factory(function(id,factory){
modules[id] = {
id : id,
factory : factory,
}
});
var require = function (id) {
var module = modules[id];
if(!module){
return;
}
if(!module.exports){
module.exports = {};
module.factory.call(module.exports,require,module.exports,module);
}
return module.exports;
}
window.require = require;
return require(main);
}

使用示例

Module('main',function(define){
define('Hello',function(require,exports,module){
function sayHello () {
console.log('hello');
}
//有效的写法
module.exports = {
sayHello : syaHello;
}
//或者
exports.sayHello = sayHello;
});
//mian,程序入口
define('main',function(require,exports,module){
var Hello = require('Hello');
Hello.sayHello();
});
});

实现3

另外一种风格的模块管理

(function(global) {
var exports = {}; //存储模块暴露的接口
var modules = {}; // 
global.define = function (id,factory) {
modules[id] = factory;
}
global.require = function (id) {
if(exports[id])return exports[id];
else return (exports = modules[id]());
}
})(this);

使用示例

define('Hello',function(require,exports,module){
function sayHello() {
console.log('hello modules');
}
//暴露的接口
return {
sayHello : sayHello
};
});
var Hello = require('Hello');
Hello.sayHello();

实践

有了简易的模块化管理之后,在项目中,我们就可以采取这样的结构

-- proj

-- html
-- index.html
-- css
-- js
-- common
-- module1.js(通用模块1)
-- module2.js(通用模块2)
-- page
-- index.js(页面逻辑)
-- lib
-- moduler.js 模块管理库

配合前端构建工具(wepack,grunt,gulp等等),就可以构建一个移动端的页面。

总结

如今的框架非常地多,而且越做越庞大。框架通常考虑通用性,对于精益求精的项目来说,可能有时候也要自己动手去实现一些关键的点,而学习的来源就是这些牛逼的框架。

Javascript 相关文章推荐
会自动逐行上升的文本框
Jun 30 Javascript
js获取单选按钮的数据
Nov 27 Javascript
js 实现菜单上下显示附效果图
Nov 21 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
Jan 09 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
May 19 Javascript
详解JavaScript 中的 replace 方法
Jan 01 Javascript
JavaScript设计模式经典之命令模式
Feb 24 Javascript
解读Bootstrap v4 sass设计
May 29 Javascript
JS奇技之利用scroll来监听resize详解
Jun 15 Javascript
Vue事件修饰符native、self示例详解
Jul 09 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
Nov 12 Javascript
JS+DIV实现拖动效果
Feb 11 Javascript
JavaScript工具库之Lodash详解
Jun 15 #Javascript
jQuery创建折叠式菜单
Jun 15 #jQuery
JavaScript的Proxy可以做哪些有意思的事儿
Jun 15 #Javascript
Async/Await替代Promise的6个理由
Jun 15 #Javascript
一些可能会用到的Node.js面试题
Jun 15 #Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
Jun 15 #Javascript
通过实例讲解JS如何防抖动
Jun 15 #Javascript
You might like
php 获取一个月第一天与最后一天的代码
2010/05/16 PHP
php HandlerSocket的使用
2011/05/02 PHP
php车辆违章查询数据示例
2016/10/14 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
javascript+mapbar实现地图定位
2010/04/09 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
vue cli 全面解析
2018/02/28 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
Python实现端口复用实例代码
2014/07/03 Python
在Django的上下文中设置变量的方法
2015/07/20 Python
在python的类中动态添加属性与生成对象
2016/09/17 Python
python实现给微信公众号发送消息的方法
2017/06/30 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
Python 面试中 8 个必考问题
2018/11/16 Python
Python netmiko模块的使用
2020/02/14 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
五一家具促销方案
2014/01/10 职场文书
加拿大留学自荐信
2014/01/28 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
四群教育工作实施方案
2014/03/26 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
商业门面租房协议书
2014/11/25 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
医院保洁员管理制度
2015/08/05 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技