AngularJS RequireJS Browserify 和 Javascript 模块/全局范围噩梦 [关闭]

2024-06-23

我最近在 CommonJS 与 AMD 的战斗中进行了一些挖掘,这是我的发现...... (顺便说一句,我不是在这里说教,而是分享我的想法以获得一些建设性的见解......) RequireJS 给我的 Angular 模块带来了很大的复杂性,我觉得这是错误的,因为它是模块中的模块包装...... Browserify 方式更干净,但要使其能够正确处理所有事情,您需要正确实现所有依赖项和依赖项依赖关系,不幸的是我们并不生活在一个完美的世界中......所以您必须进行垫片和垫片填充库的内部依赖性...我不太喜欢额外的复杂性...

我目前正在寻求的方式(并受到你们所有建设性批评......)

我有一个 grunt 文件连接并缩小了我的所有资源,像 BreezeJS、$、Q、Ladda 等库...在全局范围内泄漏... 然后我为这些全局变量声明这个类型模块:

module.value('gLadda', (function(){

    if("Ladda" in window && "Spinner" in window){
        return Ladda;
    }else{
        throw new Error("The Globals Ladda || Spinner are missing");
    }

})());

在我的应用程序中使用“Angularify”依赖项之后,我还没有在团队中使用过这种技术,我想知道这是否会为某些人亮起红灯,以及他们是否会解释原因...谢谢您的时间。


根据我的功能请求包含 AMD 加载程序 https://github.com/NathanielAJohnson/angularAMD作为附加 ng 模块的一部分。

Angular 附带一项功能,允许用户创建模块定义并稍后通过字符串标识符查找控制器等实体。 Angular 不具备加载存储在单独文件中的脚本的能力,这意味着您有四个选项:

  1. 将所有 JavaScript 存储在一个文件中。
  2. 将 javascript 分成单独的文件,并为每个文件添加脚本标签。
  3. 使用 AMD 文件加载器,例如要求JS http://requirejs.org/管理脚本文件及其依赖项。
  4. 使用像这样的预编译器浏览器化 http://browserify.org/将 nodejs 样式文件合并到单个脚本文件中。

随着项目的增长,文件变得更加难以管理,不仅仅是因为它们的大小,还因为模块之间的依赖关系变得更加复杂。大型项目还可以受益于 AMD 加载程序的延迟加载。

AMD 模块加载器列出了运行此文件之前需要存在的依赖项。问题是 AMD 依赖项与 Angular 使用的注入列表很接近,但并不完全相同。从这段代码中可以看出一个问题:

define(['angular'], function(angular) {
  return angular.module('myApp.controllers', ['myApp.services'])
    .controller('MyController', ['$scope', 'myService',
      function($scope, myService) {
        $scope.data = myService.getData();
      }
    ])
};

顶部的定义语句表示要确保angular在运行此函数之前进行初始化。这angular.module语句表示查找“$scope”和“myService”并将它们注入变量中$scope and myService。问题是 AMD 加载程序可能没有初始化定义的文件myApp.services,其中您可以假设已定义myService,因为它没有出现在上面的define语句中。这会在注入列表和 AMD 依赖项列表之间造成巨大的脱节。不仅很难判断 'myApp.services;已加载,也很难判断“myApp.services”中有哪些特定组件可用。 IOW“myService”是否已加载且可注入?

我目前以 requirejs 的形式使用选项 #3,因为我需要能够通过路由动态加载控制器(请参阅第一个链接)。另外,我现在使用的应用程序的大小使得 browserfy 不切实际,因为页面太多。然而,我确实同意这是次优的,但目前我没有看到任何其他选择。
从实际的角度来看,我为每个文件定义一个可注入。我还尝试使所有可注入数组与所需数组匹配。这不是必需的,但它使代码更易于维护。

我发现这些文章对编写此内容很有帮助:

https://github.com/marcoslin/angularAMD https://github.com/marcoslin/angularAMD

http://weblogs.asp.net/dwahlin/archive/2013/05/22/dynamically-loading-controllers-and-views-with-angularjs-and-requirejs.aspx http://weblogs.asp.net/dwahlin/archive/2013/05/22/dynamically-loading-controllers-and-views-with-angularjs-and-requirejs.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS RequireJS Browserify 和 Javascript 模块/全局范围噩梦 [关闭] 的相关文章

  • Puppeteer - 错误:协议错误 (Network.getResponseBody):找不到具有给定标识符的资源

    我正在尝试使用此代码使用 puppeteer 从网站获取响应正文 usr bin env node require dotenv config const puppeteer require puppeteer const readline
  • 如何在 js.erb 中使用 Ruby 代码?

    我可以使用以下方式在模态中渲染部分内容escape javascript在js erb文件代码中 body append my modal modal show 但是 我似乎无法获得以下结果 console log ERB 将输出一个纯字符
  • 克隆表行

    我怎样才能使用javascript 我假设 来克隆一个表格行 就像下图所示的那样 您可以将现场活动连接到所有按钮 例如 如果您给他们一类克隆 则以下内容将起作用 input clone live click function put jqu
  • 使用 IE 11 和 AngularJS 的 2 路数据绑定问题

    我最近在使用 AngularJS 的 Web 应用程序上构建了一个功能 但在 IE 11 上遇到了一些问题 apply 将数据更改写入 DOM 由于某种原因 这种情况仅有时发生 而当我尝试调试问题时却从未发生 这使得它看起来像是一个计时问题
  • 用玩笑模拟高阶组件

    我想确保 HOC 组件被开玩笑地调用 但我似乎无法理解jest mock上班 我的 HOC 是这样的 const withEntity args gt const wrappedComponent WrappedComponent gt c
  • 如何在 Jasmine JS 中重用 beforeEach/afterEach?

    当使用 JasmineJS 编写测试时 我有许多具有类似 beforeEach afterEach 代码的测试 有没有办法使用 JasmineJS 测试套件实现继承模型 我可以将所有测试分组为一个describe但在这种情况下 我将以包含所
  • 客户端 GitHub 身份验证

    我正在使用 Javascript 对 GitHub 进行基本身份验证 例如 以下 shell 命令从 Github 获取令牌 curl i u uaername password k d scopes repo https api gith
  • 如何使用React Native在屏幕上绘图?

    我正在尝试在 React Native 中实现一个 Android 绘图应用程序 我正在使用 PanResponder 但我不知道如何获取用户触摸的部分的坐标 我尝试过使用react native svg但我不知道该放在哪里PanRespo
  • 在 Javascript 中隐藏按钮

    在我最新的程序中 有一个按钮 单击时会显示一些输入弹出框 这些框消失后 如何隐藏按钮 You can set its visibility财产 http www w3schools com cssref pr class visibilit
  • 通过标记或JS强制下载

    假设我在 CDN 来自 Rackspace 的云文件 上有一个文件 以及一个包含该文件链接的静态 html 页面 有什么方法可以强制下载此文件 以防止它在浏览器中打开 例如 mp3 我们可以让我们的服务器读取该文件并将相应的标头设置为 he
  • Angular 4 - 具有动态参数值的自定义验证器

    我编写了一个自定义验证器 用于检查日期是否高于某个最小日期 代码如下所示 export function validateMinDate min Date ValidatorFn return c AbstractControl gt if
  • 在 Javascript 中实现 Zobrist 哈希

    我需要在 Javascript 中为国际象棋引擎实现 Zobrist 哈希 我想知道实现此目的的最佳方法是什么 现在 我不是计算机科学家 也从未上过正式的算法和数据结构课程 所以如果我在这方面有点偏离 我很抱歉 据我了解 我需要一个 64
  • 将“http://”添加到尚未包含“http://”的 URL 前面

    我有一个input保存 URL 的字段 我希望这个保存的输入能够识别变量开头不存在 Http 但不知道从哪里开始 是否可以仅检查字符串的一部分 然后有一个在必要时追加的函数 如果您还想允许 https 我会使用如下正则表达式 if http
  • 如何转义 onClick 处理程序内 JavaScript 代码中的字符串?

    也许我只是想得太难了 但我在弄清楚链接的 onClick 处理程序内的某些 JavaScript 代码中的字符串上使用什么转义时遇到了问题 例子 a href Select a The and 是发生模板替换的地方 我的问题是项目名称可以包
  • 解析字符串:提取单词和短语 [JavaScript]

    我需要在以空格分隔的术语列表中支持确切的短语 用引号引起来 因此 用空格字符分割相应的字符串已经不够了 Example input foo bar lorem ipsum baz output foo bar lorem ipsum baz
  • JavaScript 模板文字稍后替换变量(在知道值之前)

    是否可以在已知值之前以某种方式使用模板文字 JS 模板文字的每个演示都如下所示 var name John var s Hello name 但在现实世界中 模板是在我们知道变量值之前定义的 某处定义了模板 在页面加载时 var s Hel
  • 如何使用 JQuery 创建新的 img 标签,并使用 JavaScript 对象中的 src 和 id?

    我从基本意义上了解 JQuery 但对它绝对是新手 并且怀疑这很容易 我在 JSON 响应中获得了图像 src 和 id 转换为对象 因此在 responseObject imgurl 和 responseObject imgid 中获得了
  • 如何拦截javascript中innerHTML的变化?

    我需要拦截网页内单元格内容的任何更改 以下代码显示 addEventListener 不起作用 function modifyText alert var el document getElementById mycell el inner
  • Promise链基本问题

    我正在尝试理解 Promise 我创建了一些有效的承诺链 而另一些则无效 我已经取得了进步 但显然缺乏基本概念 例如 以下承诺链不起作用 这是一个愚蠢的例子 但说明了问题 我正在尝试在链中使用 Node 的函数 randomBytes 两次
  • 如何将国家/地区代码与电话号码分开?

    我的数据库中有很多电话号码 例如 1 123 456 7890 我要做的是将国家 地区拨号代码 在本例中为美国 加拿大的 1 与电话号码分开 我尝试创建所有国家 地区的 JSON 列表 并在加载页面时将电话号码和国家 地区代码分开 它工作正

随机推荐