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 相关文章推荐
JS input文本框禁用右键和复制粘贴功能的代码
Apr 15 Javascript
jquery隐藏标签和显示标签的实例
Nov 11 Javascript
jQuery实现文本展开收缩特效
Jun 03 Javascript
深入理解(function(){... })();
Aug 16 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
Dec 26 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
Sep 07 Javascript
JS中Map和ForEach的区别
Feb 05 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
Dec 11 jQuery
Angular Excel 导入与导出的实现代码
Apr 17 Javascript
基于JS实现一个随机生成验证码功能
May 29 Javascript
JS几个常用的函数和对象定义与用法示例
Jan 15 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
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
Javascript获取当前时间函数和时间操作小结
2014/10/01 Javascript
json的使用小结
2016/06/08 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
jQuery中Datatables增加跳转到指定页功能
2017/02/08 Javascript
jQuery实现获取h1-h6标题元素值的方法
2017/03/06 Javascript
bootstrap模态框示例代码分享
2017/05/17 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
python抓取网页图片示例(python爬虫)
2014/04/27 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
django API 中接口的互相调用实例
2020/04/01 Python
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
试用期员工考核制度
2014/01/22 职场文书
监察局领导班子四风问题整改措施思想汇报
2014/10/05 职场文书
借条格式范本
2015/05/25 职场文书
电视新闻稿
2015/07/17 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB