热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

js浅易模块加载器示例剖析

前端模块化关注前端技术发展的列位亲们,一定对模块化开辟这个名词不生疏。跟着前端工程愈来愈庞杂,代码愈来愈多,模块化成了必不可免的趋向。种种范例因为javascript自身并没有制订

前端模块化

关注前端技术发展的列位亲们,一定对模块化开辟这个名词不生疏。跟着前端工程愈来愈庞杂,代码愈来愈多,模块化成了必不可免的趋向。

种种范例

因为Javascript自身并没有制订相干范例(固然es6已经有了import和export),所以在模块化方面降生了种种差别的范例。主要有AMD范例(随requirejs降生而提高),CMD范例(随seajs的涌现而提高),commonjs(主要用于node,并不合适前端)。至于以上几种范例的异同,无耻的我在这里就不多费口水了,请还不相识的亲们自行去找google爸爸。

浅易模块加载器示例

G点来了!
接下来我们先来看一段发起模块加载器的示例代码:

let Module = (() => {
let module_list = {};
function define(name,rely,callback){
if (module_list[name]){
console.log("The module have already existed!")
}else{
for(let i = 0;i rely[i] = module_list[rely[i]];
}
module_list[name] = callback.apply(callback,rely);
}
}
function require(name){
if (module_list[name]){
return module_list[name]
}else{
console.log("There is no such module!")
}
}
let api = {
"define":define,
"require":require
};
return api;
})();

以上是加载器的完成,再来看看怎样运用吧:

Module.define("test",[],()=>{
function sayHello(name){
return name+",你好啊";
}
return {
"sayHello":sayHello
}
})
Module.define("haha",[],()=>{
function gotoHZ(name){
return name+"要去杭州玩了";
}
return {
"gotoHZ":gotoHZ
}
})
Module.define("my_module",["test","haha"],(test,haha)=>{
let name = "andrew";
function sayHello2() {
let str = test.sayHello(name);
console.log(haha.gotoHZ("章炜"))
str = str + ",今天天气不错噢";
return str;
}
return {
"sayHello2":sayHello2
}
})
console.log(Module.require('my_module').sayHello2())
console.log(Module.require('test').sayHello("steve"))

在以上代码中,我们定义了三个模块,离别名为test,haha,my_module。看到这里的你,假如js基本不好,多是一脸懵逼,头脑绕晕…先不急,让我们来看看运转的效果:
《js 浅易模块加载器 示例剖析》

效果很简朴,打印了一些我们想要的信息。

代码剖析

接下来我们细致来剖析一下代码道理。
加载器中的几个重点,

  1. module_list

    module_list是一个对象,用于存储定义的模块,以模块名:callback如许
    的键值对的情势存储;

  2. define函数

    然后我们定义了一个define函数,其三个参数离别为模块名、此模块依靠列表、此模块回调函数,当我们挪用define函数时,起首先去搜检module_list
    象中是不是已经有同名模块,假如有,直接通知用户该模块名字已被运用,假如没有,我们轮回依靠列表rely,轮回中的操纵用于将依靠列表从称号列表转换为真正的模块列表,然后应用apply函数,将其逐一传入到定义好的callback函数中。

  3. require函数
    因为我们的module_list存在于内部作用域,保证了模块的私密性,外部并不能
    直接操纵模块列表去读取模块,因而我们定义了一个require函数,应用闭包来读取操纵响应模块

  4. 实例剖析

    Module.define("my_module",["test","haha"],(test,haha)=>{
    let name = "andrew";
    function sayHello2() {
    let str = test.sayHello(name);
    console.log(haha.gotoHZ("章炜"))
    str = str + ",今天天气不错噢";
    return str;
    }
    return {
    "sayHello2":sayHello2
    }
    })

这里我们定义了my_module模块,它依靠的模块有testhaha两个模块,而在回调函数中,我们将这两个模块传入,能够看到我们能挪用test模块的sayHello要领,能够挪用haha模块的gotoHZ要领,至此,一个简朴的模块加载器就完成了。

结语

这个简朴的模块加载器只是很简化的引见了模块加载器完成的基本道理,成熟的模块加载器固然是要庞杂很多,然则道理相识了,才是最主要,不是嘛~


推荐阅读
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
  • CSS模块化命名 ... [详细]
  • 拖拉切割直线 ... [详细]
  • 本文详细介绍了如何在ReactJS项目中集成Onsen-UI的ActionSheetButton组件,并通过具体示例展示了其使用方法及效果。 ... [详细]
  • 本文介绍了如何在React应用中实现延迟加载以提高性能,以及如何利用自定义Hook和高阶组件(HOC)来增强组件功能。通过这些技术,开发者可以构建更加高效和可维护的应用。 ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • 利用Node.js实现PSD文件的高效切图
    本文介绍了如何通过Node.js及其psd2json模块,快速实现PSD文件的自动化切图过程,以适应项目中频繁的界面更新需求。此方法不仅提高了工作效率,还简化了从设计稿到实际应用的转换流程。 ... [详细]
  • 理解Redux中的中间件及其应用
    在React应用中,Redux的中间件用于增强store的功能,通过拦截和处理action,可以在action到达reducer之前进行额外的操作,如异步操作、日志记录等。 ... [详细]
  • 本文详细介绍了如何使用 HTML 和 CSS 实现一个具有动画效果的手风琴组件,包括代码示例和实现原理。 ... [详细]
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • electronvue使用electronupdater实现自动更新
    今天呢,给大家带来一篇干货满满的electron-vue自动升级的教程,话不多说,开始我的表演!配置文件package.jsonbu ... [详细]
  • 本文详细介绍了在Mac操作系统中使用Python连接MySQL数据库的方法,包括常见的错误处理及解决方案。 ... [详细]
  • StoredProcedure “存储过程名” 的TextHeader 中存在语法错误
    修改存储过程的时候出现StoredProcedure“存储过程名”的TextHeader中存在语法错误出现这样的问题的解决方法(本人修改已成功)在创建存 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
author-avatar
黯嘫吢碎1984rv
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有