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之十二 删除事件核心方法
Jul 31 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
Jul 07 Javascript
JQuery球队选择实例
May 18 Javascript
jquery悬浮提示框完整实例
Jan 13 Javascript
JS组件Bootstrap Table使用实例分享
May 30 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
Jun 13 Javascript
js基于cookie记录来宾姓名的方法
Jul 19 Javascript
vue.js学习笔记之绑定style样式和class列表
Oct 31 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
Dec 02 Javascript
Angular.js中数组操作的方法教程
Jul 31 Javascript
ReactJs实现树形结构的数据显示的组件的示例
Aug 18 Javascript
seajs实现强制刷新本地缓存的方法分析
Oct 16 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
Protoss兵种对照表
2020/03/14 星际争霸
留言板翻页的实现详解
2006/10/09 PHP
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
php操作mongoDB实例分析
2014/12/29 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
python轻松查到删除自己的微信好友
2016/01/10 Python
Python算法应用实战之队列详解
2017/02/04 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
Python制作数据预测集成工具(值得收藏)
2020/08/21 Python
python开发一款翻译工具
2020/10/10 Python
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
大学生自我评价怎样写好
2013/10/23 职场文书
打架检讨书100字
2014/01/08 职场文书
应届大学生简历中的自我评价
2014/01/15 职场文书
父亲的菜园教学反思
2014/02/13 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
2015年酒店销售部工作总结
2015/07/24 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书