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 相关文章推荐
JavaScript 学习笔记(七)字符串的连接
Dec 31 Javascript
js禁止回车提交表单的示例代码
Dec 23 Javascript
Jquery插件easyUi表单验证提交(示例代码)
Dec 30 Javascript
JavaScript实现快速排序的方法
Jul 31 Javascript
Bootstrap选项卡与Masonry插件的完美结合
Jul 06 Javascript
JS前端笔试题分析
Dec 19 Javascript
jQuery dateRangePicker插件使用方法详解
Jul 28 jQuery
利用Vue2.x开发实现JSON树的方法
Jan 04 Javascript
你可能不知道的CORS跨域资源共享
Mar 13 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
Aug 08 Javascript
如何在 Vue 表单中处理图片
Jan 26 Vue.js
VUE递归树形实现多级列表
Jul 15 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
我的群发邮件程序
2006/10/09 PHP
如何用php获取文件名后缀
2013/06/09 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
js+html制作简单验证码
2017/02/16 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
JS温故而知新之变量提升和时间死区
2019/01/27 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
python中map()与zip()操作方法
2016/02/27 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
python编写弹球游戏的实现代码
2018/03/12 Python
python lxml中etree的简单应用
2019/05/10 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
欢送退休感言
2014/02/08 职场文书
2014政务公开实施方案
2014/02/19 职场文书
股东合作协议书范本
2014/04/14 职场文书
企业总经理任命书
2014/06/05 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
2015新学期家长寄语
2015/02/26 职场文书
评职称个人总结
2015/03/05 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
小王子读书笔记
2015/06/29 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书
Python初识逻辑与if语句及用法大全
2021/08/07 Python