用纯Javascript打造类似NodeJS的模块载入系统

WeexBox 快速上手 概述 Weex是由阿里巴巴研发的一套移动跨平台技术框架,研发的初衷是为了解决移动开发过程中频繁发版和多端研发的问题。使用Weex提供的跨平台技术,开发者可以很方便的使用Web技术来构建高性能、可扩展的Native级别的性能体验,并支持在Android、iOS、YunOS和Web等多平台上进行部署。具体的说,当在项目中集成WeexSDK之后,就可以使用JavaScript和现代流行的前端框架来开发移... 阅读详情

NodeJS的模块系统有两个重要的特点:

1. 模块中直接用var定义的变量是仅作用与当前模块的,而不是全局。

2. 每个模块中都可以使用require和module这两个“全局变量”。之所以打上引号,因为它们其实是每个模块都有的通用实例,不同模块中的实例是不一样的。

也许你会认为这两个特性和我们在浏览器中使用的Javascript性质有很多不同,一定是NodeJS运行环境提供的native特性,那就不一定了。尽管没有研究过NodeJS是如何实现的,但是我们用纯Javascript完全可以做出一样的模块系统。这其实只要要用到一个Javascript中很少用的语法:new Function()。


Javascript中除了用function func(){}来定义一个函数之外,还可以用new Function()来创建一个函数。Function是Javascript中所有函数的prototype,即所有函数的基类。通过给Function.prototype增加属性可以给所有的函数实例增加属性,这也是大家相对常用的一个做法。今天要给大家介绍的是通过直接new Function()来创建一个函数,尽管这被认为性能不好,但在某些特殊场景能做到一些很有用的功能。


new Function()的详细语法格式是:

new Function(args, body)
这里的args是一个字符串,表示函数的参数,参数之间用逗号隔开,而body则是函数体本身。比如:
var add = new Function('x, y', 'return x + y;');
这样创建的函数就等价于:
var add = function(x, y){
     return x + y;
}
这两者效果没有任何区别,通常我们也只会用第二种做法,因为有更好的可读性。


现在我们来看new Function的两种潜在应用场景:
1. 避免命名冲突
大家知道通过<script>标签引入的Javascript文件是全局的,每个文件中定义的变量都是全局的,这时为了避免命名冲突,可以通过如下的小技巧:
(function(){
     var x = 0;
     //my code
})();
通过外包一个函数并立刻调用,可以做成一个闭包,其中的变量的作用域就只局限于函数体之内。从而避免了与其它的文件之间的命名冲突。但是在有些情况下,我们需要使用一个第三方的Javascript文件或者因为某些原因而无法修改的文件,它完成某个独立的任务,但是其中定义了一些全局变量。这些文件无法被修改成使用上面提到的方法来避免命名冲突。这时我们的new Function()就可以发挥作用了。这时我们不是通过<script>引入Javascript文件,而是通过XMLHttpRequest获得Javascript文件的内容,然后用如下的方式来执行这个Javascript:
var result = (new Function('', jsCode + '; return {x: x}'))();
这样,我们相当于也是在jsCode外面包装了一层function,并且,我们把需要用的的结果作为返回值返回出来,供外面程序使用。当然,对于大部分独立的文件,我们并不一定需要返回值,而只是需要执行一下即可。下面来看下一个应用场景。


2. 打造自己的模块载入系统
这也是上一种应用场景的一个延伸,既然我们通过这种方式来载入Javascript文件,何不将其做成一个通用的模块载入系统,供自己的项目使用。从而不用每个文件都外包一层function来避免命名冲突。其实如果大家用过NodeJS,就也许知道,NodeJS中的每个模块中定义的变量都是局限于当前模块的,不会被其它模块直接使用。而且每个模块中还有一个默认的require和module变量,这两个每个模块中都可以像使用全局变量一样使用,但它们却又不是全局变量,NodeJS文档中写的也很清楚,它们在各个模块中都是不同的实例。这样,一个模块都它们进行的修改并不会影响到其它模块。你也许会认为这一定是NodeJS的native环境提供的特殊功能,但实际上,我们完全可以用纯Javascript打造出一个同样的模块机制,只需对上面提到的例子做一点修改,比如这个loader是有类似如下的代码:
var require = getRequireInstance();
var module = getModuleInstance();
 //通过XMLHttpRequest获得要载入的Javascript文件的代码
var moduleText = getModuleText(); 
//执行模块代码,并“注入”require和module变量。
(new Function('require, module', moduleText))(require, module);
怎么样,是不是很简单?new Function()虽然是一个很少用的功能,但是确实非常灵活,更多应用场景就靠大家继续挖掘了。
Node.js-一个针对Node.js进程类似于"top"的模块可用于收集CPU使用率等 一个针对Node.js进程类似于"top"的模块,可用于收集CPU使用率等 立即下载

相关推荐

Node.js-基于DuilibCEFNodeJs的类似electron的UI框架

基于Duilib CEF NodeJs的类似 electron 的UI框架

其他内容:Node.js 替代方案

Node.js是最流行的服务器端 JavaScript 框架之一。Node js 是最受欢迎的服务器端 javascript 框架之一。Node.js提供异步和事件驱动的架构、效率、可重用性和可伸缩性。Node.js的速度和性能为 Netflix、LinkedIn 等大公司带来了出色的成绩。但是,我们将探索这个框架的许多新替代方案。许多新开发人员将Nodejs误认为是C++或Python等编程语言。但它不是一种编程语言。但是,它是在 C++、C 和 Javascript 的帮助下编写的。Node.js。

新华编程特战队 1642

【OTDR曲线工具箱】04 批量生成sor文件

软件下载地址:http://120.78.150.214:9999/isora.zip 通过一个测试数据sor文件,批量生成多个测试文件(基于Bellcore GR196及SR-4731标准)。主要考虑哪些问题: 1、sor测试是否符合要求(主要是衰减系数) 2、多个文件的创建时间 3、文件必须随机处理,不要看省去一模一样。 来说说怎么操作的 第一步:选择参考曲线 参考曲线的选择由两种方法:从文件中导入、从曲线库中选择。 其中曲线库分为公共库和个人库两种,平时浏览的sor文件都可以加载到库中。 第二步

夜晚是传说的博客 5271

除了Node. js还有哪些模型

在当今的软件开发领域,Node.js 凭借其独特的优势和广泛的应用场景,成为众多开发者构建应用程序的热门选择。但技术的海洋是广阔无垠的,开发模型丰富多样。那么,除了 Node.js 之外,还有哪些模型能为开发者带来新的思路与解决方案呢?

2403_88087488的博客 1460

Origin绘制带差异显著性标记的分组均值条形图|科研论文图表教程(附数据格式模板)

传统柱状图虽能呈现组间均值差异,却隐藏个体数据分布;散点图虽能展示原始数据,却难以直观凸显统计显著性。带差异显著性(*)的分组均值条形图——它以“双层叙事”的创新设计,同时呈现群体特征与个体差异。

weixin_50236590的博客 1493

ADSP-21565的SigmaStudio图形化编程实战:从FW工程改造到音频通道打通

本文详细介绍了如何将ADSP-21569的SigmaStudio图形化编程固件工程改造,以适配ADSP-21565的纯片内SRAM内存架构。通过修改内存映射和链接文件,打通了音频输出通道,并成功利用SigmaStudio进行图形化编程,实现了从白噪声生成到音频输出的完整验证流程。

weixin_29169505的博客 380

基于命令行的Java脚手架

jmvn 现阶段SpringBoot + Maven多模块是构建Java后台项目的标准格式,但是Maven多模块和成熟的Java项目结构搭建起来也是比较费力的。 对于一个老鸟来说可能需要5分钟,但是对于一个小白或者是非专业认识,可能需要更长的时间。 这里提供一个命令行交互式的构建工具,希望能解决这种简单重复的工作。 jmvn就是为了解决这问题诞生的, 一个快速构建Maven多模块应用的构建工具 ...

西魏陶渊明的博客 1003

Tesla V100 在 Windows 下的驱动选择与模式切换实战

本文详细解析了Tesla V100专业计算卡在Windows系统下的驱动安装与模式切换实战。针对设备管理器识别但任务管理器“隐身”的常见问题,文章指出其默认TCC模式为纯计算设计,并指导用户正确选择数据中心或GRID驱动。核心在于通过注册表修改或驱动选择,在高效的TCC模式与便于监控的WDDM模式间切换,同时提供了nvidia-smi命令行监控与AI框架测试等稳定使用方案。

weixin_29247219的博客 1807

Nodejs差不多也到顶峰了吧?

Javascript现在应该是很火的语言了,特别是受到了Node.js的照顾后,已经是前后端通吃的地步了,甚至连嵌入式领域也开始涉足。但是慢慢随之而来的弊端也开始出现了,本文不打算说Node.js的优点,因为几乎网上都是优点,而只是来说说Node.js的缺点。 缺点1 庞大的NPM包 NPM是随着Node.js一同出来的库管理软件,这种一键式下载第三方库的出现,立即将Node.js带入了快车道,目...

weixin_34122604的博客 838

LTO编译器优化介绍以及开启方法

LTO优化的详细介绍

性感的小君君 4924

自然二进制数与格雷码的相互转换

自然二进制数与格雷码两者优势: 自然二进制数的编码方式简单明了,容易理解,在加减运算中能够直接进行,同时十分方便进行一些位运算操作(如移位、取反等)。 格雷码计数时只有一位变化,可有效减少计数器状态的冗余转换,同时在传输数据时能够减小传输错误的概率,此外带权重编码处理更加方便。 在一定程度上自然二进制数与格雷码优缺点基本相反,综上所述,自然二进制数和格雷码各有优劣之处,需要根据具体应用场景选择合适的编码方式。简单来说,在计数器和编码器中,倾向于使用格雷码;而在进行加减运算时,则倾向于使用自然二进制数。

Loudrs的博客 7494

IT前沿技术之node.js篇<五>:Node.js与Nginx

早上好!一夜的休息让我们精神饱满。窗外阳光满满,微风轻轻。让我踏上征服IT前沿技术的旅程。 昨天我们学习了JavaScript以及Node.js的基本特性、连接数据库、服务端模板和RESTful-API,今天我们要将这些点系统地组织架构起来,搭建轻轻松松处理数万用户的高性能的web应用服务。首先我们需要用到一个神器,它叫Nginx。 在互联网服务器架构中,我们可以经常听到LAMP(Linu

IT技术精研院 1357

从入门到精通:dirmap 高级 Web 目录扫描实战指南

本文提供了一份从环境搭建到高级配置的dirmap Web目录扫描实战指南。详细解析了工具安装、核心配置文件dirmap.conf的深度调优,包括递归扫描、四种扫描模式(字典、爆破、爬虫、Fuzz)的实战应用,并演示了分阶段资产发现的完整工作流程,帮助安全人员高效发现隐藏目录与敏感文件。

rnn9storyteller的博客 482

js通过model从后端取值_Node.js躬行记(4)——自建前端监控系统

  这套前端监控系统用到的技术栈是:React+MongoDB+Node.js+Koa2。将性能和错误量化。因为自己平时喜欢吃菠萝,所以就取名叫菠萝系统。其实在很早以前就有这个想法,当时已经实现了前端的参数搜集,只是后台迟迟没有动手,也就拖着。目前完成的还只是个雏形,仅仅是搜集了错误和相关的性能参数。后台样式采用了封装过的matrix。分析功能还很薄弱,只是做了简单的演示,并且各种基础功能还有待完...

weixin_39559071的博客 172

第51节:cesium 范围查询(含源码+视频)

cesium 范围查询

qq_29384639的博客 1498

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python 执行js 提示window未定义_Node.js躬行记(4)——自建前端监控系统

  这套前端监控系统用到的技术栈是:React+MongoDB+Node.js+Koa2。将性能和错误量化。因为自己平时喜欢吃菠萝,所以就取名叫菠萝系统。其实在很早以前就有这个想法,当时已经实现了前端的参数搜集,只是后台迟迟没有动手,也就拖着。目前完成的还只是个雏形,仅仅是搜集了错误和相关的性能参数。后台样式采用了封装过的matrix。分析功能还很薄弱,只是做了简单的演示,并且各种基础功能还有待完...

weixin_39861734的博客 384

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

愿码(ChainDesk.CN):【EOS钱包开发 三】钱包项目整体架构设计

本课程是EOS钱包开发,后端使用的NodeJS搭建,客户端使用的web前端,VSCode开发工具,Ubuntu16.04开发环境,node v8.11.3,npm v5.6.0。 一、前端架构 咱们的开发重点是在后端实现上,因此为了让大家快速上手,web客户端没有使用其它流行的框架,这里只使用了jQuery框架简化代码,另外还有个jQuery Validate 插件简化了表单验证。 ...

weixin_43970764的博客 446

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

HTML5前端学习路线

一.HTML5初级开发工程师1.HTML5介绍互联网发展趋势H5语言的优势简单易学人人都能编程H5就业和薪资情况H5常见的项目与产品H5的未来与方向2.HTML基础HTML简介与历史版本常用开发软件常见标签与属性表格与表单标签规范与标签语义化实战:网页结构布局3.CSS基础css简介与基本语法常见的各种样式属性CSS选择器与标签类型理解盒子模型与CSS重置浮动与定位利用photoshop工具测量样...

liuyingv8的博客 555

为什么选择 Yeoman 及 Yeoman 的安装

转载自http://blog.sina.com.cn/s/blog_761dcfc60101dii0.html 为什么选择Yeoman及Yeoman的安装 (2014-05-12 20:30:56) 转载▼ 标签: yeoman 网络前端 grunt bower 安装 分类:学习 原创今天向您...

weixin_30566111的博客 199
上一篇: Dojo JSONP 入门
下一篇: 创建完全支持dojox.form.manager的自定义表单控件
dojotoolkit
博客等级 码龄16年 1205粉丝 61原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值