我们知道NodeJS有一套简洁的格式写模块,它遵循的就是 Moudles
。
浏览器里的JavaScript呢? 尽管语言本身暂不支持模块,但可以用现有的API包装一个写法出来。
毫无疑问,首先想到的是NodeJS的module格式
,它是最好的效仿对象。因为前后端有一个统一的方式写JS模块岂不乐哉!
但一开始就有碰到一些难题
1,服务器端JS模块文件就在本地,浏览器端则需要通过网络请求
2,服务器端可以很容易的实现同步或异步请求模块,浏览器端则问题多多。
如下
var event = require("event");
event.bind(el, 'click', function() {
// todo
});
这段代码中require如果是异步执行的,则event.bind的执行有可能会出错。
那实现同步的require不就行了吗?
的确可以使用 XHR
实现同步载入模块JS文件。但XHR的缺点也是明显的,它不能跨域,这点让人很难接受,因为有些场景需要模块部署在不同的服务器。
那只能通过script tag来实现模块加载了。
但script tag默认就是异步
的,要实现NodeJS的一模一样风格(Modules
)问题多多,几乎是不可能。
这时,又一模块格式出现了:Modules/Wrappings
(还有AMD
),顾名思义包裹的模块。该规范约定如下
1,定义模块用module变量,它有一个方法declare
2,declare接受一个函数类型的参数,如称为factory
3,factory有三个参数分别为require、exports、module
4,factory使用返回值和exports导出API
5,factory如果是对象类型,则将该对象作为模块输出
描述有拗口,代码却很简单,使用了一个function包裹模块(NodeJS模块则无需包裹)。
一个基本的模块定义
module.declare(function(require, exports, module)
{
exports.foo = "bar";
});
一个使用返回值的模块定义
module.declare(function(require)
{
return { foo: "bar" };
});
直接使用对象作为模块
module.declare(
{
foo: "bar"
});
Modules/Wrappings
的出现使得浏览器中实现它变得可能,包裹的函数作为回调。即使用script tag作为模块加载器,script完全下载后去回调,回调中进行模块定义。
好了,截止目前我们已经看到了两种风格的模块定义:Modules
和 Modules/Wrappings
。
CommonJS Modules有1.0、1.1、1.1.1三个版本。
NodeJS、SproutCore
实现了 Modules 1.0
。
SeaJS
、AvocadoDB、CouchDB等实现了Modules 1.1.1
。
SeaJS、FlyScript
实现了Modules/Wrappings。
注:
1,SeaJS未实现全部的 Modules 1.1.1。如require函数的main,paths属性在SeaJS中没有。但SeaJS给require添加了async、resolve、load、constructor。
2,SeaJS没有使用 Modules/Wrappings 中的module.declare定义模块,而是使用define函数。
相关:
script loaders
AMD:浏览器中的模块规范
分享到:
相关推荐
该模块尝试通过检查浏览器的标头和连接信息来唯一标识浏览器。 为什么这个? 该脚本用作内部端点,可为请求该脚本的客户端提供“浏览器指纹”打印功能。 如何获得与此相关的浏览器指纹? 使用node index.js启动...
下面将详细介绍NodeJS模块系统和ES6模块系统,并指出在使用过程中的注意点。 ### NodeJS模块系统 NodeJS最开始使用的是CommonJS模块规范,该规范由社区提出并广泛使用于NodeJS服务端开发中。CommonJS模块规范中...
- **`window`对象**:这是浏览器环境中的全局对象,但在Node.js环境中并不存在。 #### `console`对象 `console`对象提供了多种方法来帮助开发者进行调试和日志记录: - **`console.log()`**:用于输出日志信息。 ...
7. **模块系统**:作为一个JavaScript库,它很可能支持CommonJS(如Node.js的require())和ES模块(import语句)两种导入方式,以便在不同的项目结构中灵活使用。 8. **测试与文档**:一个完善的库通常会有详细的...
1. **JavaScript在Node.js与浏览器中的差异**:首先,我们会探讨JavaScript在Node.js环境下的开发与在浏览器环境的不同。Node.js提供了非阻塞I/O和事件驱动的模型,这使得它在处理高并发和实时应用时表现出色。 2. ...
- `global`: 表示 Node.js 的全局环境,相当于浏览器中的 `window` 对象。 - `process`: 提供了与当前进程交互的功能,如 `process.exit()` 用于退出 Node.js 进程。 - `console`: 提供了命令行环境的标准输入/...
在具体实现上,开发者需要首先安装captchapng模块,并且在代码中引入该模块,创建一个验证码生成函数。此函数会生成一个随机的数字字符串作为验证码,并将该字符串保存到用户的session中,以便后续验证。接着,使用...
Node.js中的timers模块是JavaScript语言中定时器功能的后端实现,其API模拟了浏览器环境中setTimeout、setInterval、 clearTimeout和clearInterval等函数的功能。timers模块允许开发者在Node.js的异步、非阻塞的环境...
该模块尝试通过检查浏览器的标头和连接信息来唯一标识浏览器。 此信息可用作节点项目中的“穷人”会话标识符。 该模块可以选择将cookie设置为“锁定”一致的指纹。 恢复会话要求将cookie返回到服务器,或者在后续...
《Node.js-dexterous:构建跨平台的轻量级同构JavaScript中间件服务器》 在当前的Web开发环境中,Node.js以其高效的非阻塞...如果你希望在你的项目中实现更高效的异步处理和同构开发,`dexterous`值得你去尝试和掌握。
- **先驱**:在Node.js之前,有一些类似的尝试,如Aptana Jaxer和Helma,它们为Node.js的发展奠定了基础。 ##### 二、Node.js 的核心思想 - **非阻塞 I/O**:这是Node.js最显著的特点之一,它使得Node.js能够处理...
如果要对客户端模块的依赖项进行存根,请尝试 ,browserify 或在Node和浏览器中进行测试。特征无需更改您的代码模块的非重写方法的行为类似于原始方法模拟框架不可知,如果它可以对函数进行存根,那么它可以与...
在“Vue管理系统”中,Vue.js 被用来构建用户界面,提供数据绑定、指令、组件和其他特性,使得开发人员能够高效地构建可复用且模块化的应用。Vue 的生态还包含 Vuex(状态管理库)和 Vue Router(路由库),它们是...
这些内容都是在开发过程中我不断尝试后的产物。我花了1周的时间才实现了一个递归的调用,而且还是同步的方式。 到目前为止,我还不能理解在异步模式下实现递归调用函数。比如说源代码中有个函数getMenuTree,菜单...
在本项目中,我们主要探讨如何使用WebSocket.IO和Node.js技术构建一个类似微信的聊天应用程序,该应用具备发送文本消息、图片以及表情的功能。WebSocket.IO是WebSocket协议的一个库,它在浏览器和服务器之间提供实时...
接下来,我们将详细探讨Node.js中的作用域问题,包括全局作用域、模块作用域以及如何在Node.js环境中处理作用域。 首先,让我们来回顾一下JavaScript中的基本作用域规则。在JavaScript中,存在两种主要的作用域类型...
3.0版现在也可以在浏览器中运行,请自行运行测试 主题 用法 验证程序将在可能的情况下尝试执行同步验证,但会在需要时支持异步回调。 发展: 这些存储库具有几个子模块,应按以下方式进行克隆: git clone-递归 ...
5. **server.js**或**app.js**:Node.js服务器文件,用于启动服务器并提供静态文件服务,使得游戏可以在浏览器中运行。 在Node.js服务器文件中,你可能会看到以下关键代码段: ```javascript const express = ...
在这段代码中,我们首先尝试打开Chrome浏览器,如果因为Chrome未安装或其他原因无法打开,则会回退到使用IE浏览器打开指定的网址。这种方法可以有效地保证用户在没有安装Chrome的情况下,仍能访问指定的网址。 上述...