Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS RequireJS Browserify和Javascript模块/全局范围_Javascript_Angularjs_Requirejs_Browserify - Fatal编程技术网

AngularJS RequireJS Browserify和Javascript模块/全局范围

AngularJS RequireJS Browserify和Javascript模块/全局范围,javascript,angularjs,requirejs,browserify,Javascript,Angularjs,Requirejs,Browserify,我最近在所有这场普通的JS对AMD的战斗中挖掘了一些东西,这是我的发现。。。 (顺便说一句,我不是在这里说教,我是在分享我的想法,以获得一些建设性的见解…) RequireJS给我的Angular模块带来了很多复杂性,我觉得这是错误的,因为它是模块中的模块包装。。。 Browserify方法更干净,但要使它正确地处理每件事,您需要正确地实现所有依赖项和依赖项,不幸的是,我们并不是生活在一个完美的世界中。。。因此,您必须不断地填充已填充库的内部依赖项。。。我不是一个超级复杂的粉丝 我目前所追求的方

我最近在所有这场普通的JS对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”依赖项之后,我还没有在团队中使用过这种技术,我想知道这是否会为一些人亮起红灯,他们是否会解释为什么。。。感谢您抽出时间。

来自作为附加ng模块一部分的功能请求

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

  • 将所有javascript存储在一个文件中
  • 将javascript分离到单独的文件中,并为每个文件添加脚本标记
  • 使用AMD文件加载器来管理脚本文件及其依赖项
  • 使用类似于将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();
          }
        ])
    };
    
    顶部的define语句表示在运行此函数之前,确保已初始化
    angular
    angular.module
    语句要求查找“$scope”和“myService”,并将它们注入变量
    $scope
    myService
    。问题是AMD加载程序可能没有初始化定义
    myApp.services
    的文件,您可以假定该文件定义了
    myService
    ,因为它没有出现在上面的define语句中。这在注入列表和AMD依赖列表之间造成了巨大的断开。不仅很难判断“myApp.services”;已经加载,也很难判断“myApp.services”中有哪些特定组件可用。“myService”既可加载又可注入吗

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

    我发现这些文章有助于撰写以下内容:


    我倾向于同意在Angular中使用Require是没有意义的。我在想,在使用Angular.js开发时,使用requirejs和browserify做同样的事情会增加更多的开销。我有一个开放的特性请求,似乎正在获得一些吸引力:我对潜在解决方案的编写:事实上,问题是适用范围比角度更广。必须在一个应用程序中使用基于CommonJS/AMD/UMD/globals的混合模块目前是一场噩梦,而工具(如browserify或webpack)不够聪明,无法解决这场噩梦。