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操作select详解(取值,设置选中)
Feb 07 Javascript
常用jQuery代码分享
Jul 14 Javascript
jQuery实现带动画效果的多级下拉菜单代码
Sep 08 Javascript
深入分析jsonp协议原理
Sep 26 Javascript
JavaScript职责链模式概述
Sep 17 Javascript
微信js-sdk地理位置接口用法示例
Oct 12 Javascript
websocket+node.js实现实时聊天系统问题咨询
May 17 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
Mar 29 Javascript
Angular2进阶之如何避免Dom误区
Apr 02 Javascript
Javascript实现购物车功能的详细代码
May 08 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
Oct 26 Javascript
过滤器vue.filters的使用方法实现
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
简单的过滤字符串中的HTML标记
2006/12/25 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
探讨:php中在foreach中使用foreach ($arr as &$value) 这种类型的解释
2013/06/24 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
ES6正则的扩展实例详解
2017/04/25 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
python连接oracle数据库实例
2014/10/17 Python
python 实现删除文件或文件夹实例详解
2016/12/04 Python
python爬虫使用cookie登录详解
2017/12/27 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
Python变量类型知识点总结
2019/02/18 Python
机器学习实战之knn算法pandas
2019/06/22 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
Python爬取股票信息,并可视化数据的示例
2020/09/26 Python
Yahoo-PHP面试题1
2016/07/20 面试题
新闻编辑求职信
2014/04/09 职场文书
初中班主任评语
2014/04/24 职场文书
开工仪式策划方案
2014/05/23 职场文书
护林防火标语
2014/06/27 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
淡雅古典唯美少女娇媚宁静迷人写真
2022/03/21 杂记
Java Spring Lifecycle的使用
2022/05/06 Java/Android
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript