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 相关文章推荐
通过遮罩层实现浮层DIV登录的js代码
Feb 07 Javascript
javascript实现网站加入收藏功能
Dec 16 Javascript
JS实现支持Ajax验证的表单插件
Mar 24 Javascript
jQuery短信验证倒计时功能实现方法详解
May 25 Javascript
实例讲解JavaScript中的this指向错误解决方法
Jun 13 Javascript
jQuery表单设置值的方法
Jun 30 jQuery
Vue axios 中提交表单数据(含上传文件)
Jul 06 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
Dec 08 Javascript
element-ui循环显示radio控件信息的方法
Aug 24 Javascript
VuePress 静态网站生成方法步骤
Feb 14 Javascript
微信小程序实现日期格式化和倒计时
Nov 01 Javascript
解决layer 动态加载select 失效的问题
Sep 18 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
PHP5.3新特性小结
2016/02/14 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
2017/08/15 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
javascript中的取反再取反~~没有意义
2014/04/06 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
angular2使用简单介绍
2016/03/01 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
事业单位接收函
2014/01/10 职场文书
个人近期表现材料
2014/02/11 职场文书
公司授权委托书范本
2014/04/03 职场文书
关于学习的演讲稿
2014/05/10 职场文书
公司晚会主持词
2019/04/17 职场文书
Nginx实现负载均衡的项目实践
2022/03/18 Servers
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers