通用JS、AMD和需要JS之间的关系?

我仍然对通用JS、AMD是否必填感到困惑,即使读了很多。

我知道通用文档(以前的ServerJS)是一个定义一些javascript规范(即模块)的组,当语言在浏览器之外使用时。通用文档模块规范有一些实现,如Node.jsRingoJS,对吧?

通用文档异步模块定义(AMD)和是否必填之间的关系是什么?

是否必填通用文档模块定义的实现吗?如果是,那么amd是什么?

192229 次浏览

通用文档不止于此-它是一个为JavaScript定义通用API和生态系统的项目。Common JS的一部分是模块规范。Node.js和RingoJS是服务器端JavaScript运行时,是的,它们都实现了基于Common JS模块规范的模块。

amd(异步模块定义)是模块的另一个规范。是否必填可能是AMD最流行的实现。与通用JS的一个主要区别是AMD指定模块被加载异步——这意味着模块是并行加载的,而不是通过等待加载完成来阻塞执行。

因此,AMD通常更多地用于客户端(浏览器内)JavaScript开发,而Common JS模块通常用于服务器端。但是,您可以在任一环境中使用任一模块规范-例如,需要JS提供在Node.js跑步浏览序列化是可以在浏览器中运行的Common JS模块实现。

是否必填实现了amd API(来源)

通用文档是在exports对象的帮助下定义模块的一种方式,该对象定义了模块内容。简单地说,Common JS实现可能是这样工作的:

// someModule.jsexports.doSomething = function() { return "foo"; };
//otherModule.jsvar someModule = require('someModule'); // in the vein of nodeexports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };

从本质上讲,Common JS指定您需要有一个require()函数来获取依赖项,一个exports变量来导出模块内容,以及一个模块标识符(它描述了有问题的模块相对于这个模块的位置)来需要依赖项(来源)。

Common JS不是特别针对浏览器设计的,所以它不太适合浏览器环境(*我真的没有这个来源-它只是到处都这么说,包括需要JS网站。*)显然,这与异步加载等有关。

从另一方面来说,需要JS实现了AMD,AMD是为适应浏览器环境而设计的(来源)。很明显,AMD开始是作为Common JS传输格式的衍生产品,并演变成它自己的模块定义API。因此两者之间有相似之处。AMD的新特性是define()函数,它允许模块在加载之前声明它的依赖关系。例如,定义可以是:

define('module/id/string', ['module', 'dependency', 'array'],function(module, factory function) {return ModuleContents;});

因此,Common JS和AMD是javascript模块定义API,它们具有不同的实现,但都来自相同的起源。

  • amd更适合浏览器,因为它支持模块依赖项的异步加载。
  • 是否必填amd的实现,同时试图保持通用文档的精神(主要是在模块标识符中)。

更让你困惑的是,作为一个AMD实现,它提供了一个Common JS包装器,以便几乎可以直接导入Common JS模块以供使用。

define(function(require, exports, module) {var someModule = require('someModule'); // in the vein of nodeexports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };});

简短的回答是:

AMD是关于如何在javascript应用程序中声明模块及其依赖项的规范(或格式)。

是一个兼容AMD的脚本加载程序库,curljs是另一个例子。

符合Common JS:

取自Addy Osmani的书

// package/lib is a dependency we requirevar lib = require( "package/lib" );
// behavior for our modulefunction foo(){lib.log( "hello world!" );}
// export (expose) foo to other modules as foobarexports.foobar = foo;

AMD兼容:

// package/lib is a dependency we requiredefine(["package/lib"], function (lib) {
// behavior for our modulefunction foo() {lib.log( "hello world!" );}
// export (expose) foo to other modules as foobarreturn {foobar: foo}});

在其他地方,该模块可以用于:

require(["package/myModule"], function(myModule) {myModule.foobar();});

一些背景:

实际上,通用文档不仅仅是一个API声明,它只是其中的一部分处理了这一点。AMD最初是Common JS列表上模块格式的规范草案,但没有达成完全的共识,该格式的进一步开发转移到amdjs集团。关于哪种格式更好的争论表明,Common JS试图涵盖更广泛的关注点,并且鉴于其同步性质,它更适合服务器端开发,而AMD更适合客户端(浏览器)开发,因为它的异步性质以及它起源于Dojo的模块声明实现。

来源:

引用

amd

  • 一种浏览器优先的方法
  • 选择异步行为和简化的向后兼容性
  • 它没有文件I/O的任何概念。
  • 它支持对象、函数、构造函数、字符串、JSON和许多其他类型的模块。

通用文档

  • 一种服务器优先的方法
  • 假设同步行为
  • 涵盖更广泛的关注点,例如I/O、文件系统、Promises等。
  • 支持未包装的模块,它可以感觉更接近ES.next/Harmony规范,让您摆脱AMD强制执行的定义()包装器。
  • 仅支持对象作为模块。

将JavaScript程序模块化组织成几个文件并从main js module调用child-modules是很正常的。

问题是JavaScript并没有提供这种功能,即使在今天最新的Chrome和FF浏览器版本中也没有。

但是,JavaScript中是否有任何关键字可以调用另一个JavaScript模块?

对许多人来说,这个问题可能是世界的彻底崩溃,因为答案是


在ES5(2009年发布)中,JavaScript没有导入包括要求等关键字。

ES6保存了一天(2015年发布)提出导入关键字(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/import),现在所有现代浏览器支持这个。

如果您使用Babel 6.18.0并仅使用ES2015选项转译

import myDefault from "my-module";

您将再次获得require

"use strict";var _myModule = require("my-module");var _myModule2 = _interopRequireDefault(_myModule);function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

这是因为require意味着模块将从Node.js.加载Node.js将处理从系统级文件读取到将函数包装到模块中的所有内容。

因为在JavaScript中,函数是表示模块的唯一包装器。

我很困惑,关于通用JS和AMD?

无论是Common JS和AMD只是两种不同的技术,如何克服JavaScript的“缺陷”来智能加载模块。

amd

  • 在JavaScript中引入以将JavaScript项目扩展为多个文件
  • 主要用于基于浏览器的应用程序和库
  • 流行的实现是是否必填Dojo工具包

通用文档

  • 是处理大型项目的大量函数、文件和模块的规范
  • 最初的名称ServerJS于2009年1月由Mozilla引入
  • 2009年8月更名为Common JS,以显示API的更广泛适用性
  • 最初实现的是服务器、nodejs、基于桌面的库

示例

upper.js档案

exports.uppercase = str => str.toUpperCase()

main.js档案

const uppercaseModule = require('uppercase.js')uppercaseModule.uppercase('test')

总结

  • AMD-最古老的模块系统之一,最初由库实现require.js.
  • -为服务器创建Node.js模块系统。
  • UMD-另一个模块系统,建议作为通用系统,与amd和Common JS兼容。

资源说明: