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 相关文章推荐
jquery里的each使用方法详解
Dec 22 Javascript
JQuery1.6 使用方法三
Nov 23 Javascript
javascript函数特点实例分析
May 14 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 Javascript
简单谈谈javascript Date类型
Sep 06 Javascript
通过设置CSS中的position属性来固定层的位置
Dec 14 Javascript
AngularJS自动表单验证
Feb 01 Javascript
原生JS实现图片翻书效果
Feb 16 Javascript
jQuery使用bind函数实现绑定多个事件的方法
Oct 11 jQuery
使用store来优化React组件的方法
Oct 23 Javascript
利用Promise自定义一个GET请求的函数示例代码
Mar 20 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
Zend Framework动作控制器用法示例
2016/12/09 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
JavaScript中三个等号和两个等号你了解多少
2017/07/04 Javascript
jQuery初级教程之网站品牌列表效果
2017/08/02 jQuery
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
vue各种事件监听实例(小结)
2020/06/24 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
python使用cookielib库示例分享
2014/03/03 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
Python列表(List)知识点总结
2019/02/18 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
解决jupyter notebook import error但是命令提示符import正常的问题
2020/04/15 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
自荐书模板
2013/12/15 职场文书
给交警的表扬信
2014/01/12 职场文书
高中军训第一天感言
2014/03/06 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
物业工程部岗位职责
2015/02/11 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
Python爬取某拍短视频
2021/06/11 Python
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技