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 相关文章推荐
chrome下img加载对height()的影响示例探讨
May 26 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
Jun 11 Javascript
angularjs学习笔记之双向数据绑定
Sep 26 Javascript
jQuery中cookie插件用法实例分析
Dec 04 Javascript
基于javascript实现九宫格大转盘效果
May 28 Javascript
在一个页面重复使用一个js函数的方法详解
Dec 26 Javascript
jquery实现超简单的瀑布流布局【推荐】
Mar 08 Javascript
JS原生数据双向绑定实现代码
Aug 14 Javascript
Node.js 如何利用异步提升任务处理速度
Jan 07 Javascript
Vue源码学习之关于对Array的数据侦听实现
Apr 23 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
Apr 24 Javascript
vue路由插件之vue-route
Jun 13 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
ThinkPHP模型详解
2015/07/27 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
微信小程序实现弹出菜单
2018/07/19 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
windows下安装Python和pip终极图文教程
2017/03/05 Python
python中解析json格式文件的方法示例
2017/05/03 Python
python学习教程之使用py2exe打包
2017/09/24 Python
python中字符串的操作方法大全
2018/06/03 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
基于python监控程序是否关闭
2020/01/14 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
总经理岗位职责
2013/11/09 职场文书
数控专业应届生求职信
2013/11/27 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
2015年学校政教处工作总结
2015/05/26 职场文书