我们可以在角度应用程序中使用requirejs来管理/模块化应用程序的一部分吗?

时间:2016-02-16 19:13:52

标签: javascript angularjs requirejs

我有一个现有的角度网络应用程序,它不使用require.js。我必须在现有应用程序中创建一个新的业务模块。我可以仅将require.js用于新模块吗?这样我就不必触及现有代码了?

现有的index.html如下所示:

<html>
<head>
...
</head>
<body>
...

<script src="http://cdn.gse.site/angular/1.2.9/angular.js"></script>
<script src="js/angular-ui-router.js"></script>
<script src="js/services/angDashboardService.js"></script>
<script src="js/controllers/angDashboardController.js"></script>
<--- More custom scripts here --->

</body>
</html>

我尝试在现有的index.html文件中包含require-main.js,而不删除任何现有的脚本标记。 require-main.js看起来像这样:

require.config({
   baseUrl: 'js',
   paths:{
      'angular' : '...'
   },
   shim: {
       'angular': {export: 'angular' },
       'new-module': {
            deps: ['angular'],   export: 'new-module'
       }
  }
});


require(['new-module'], function(){});

我收到如下错误:

Uncaught Error: [ng:btstrpd] App Already Bootstrapped with this Element '<body class="preload ng-scope" ng-app="angDashboard">'

1 个答案:

答案 0 :(得分:0)

  

我们可以在角度应用程序中使用requirejs来管理/模块化应用程序的一部分吗?

是的,你可以(但为什么......?)。如果你不知道你在做什么,那么你会受到一些严重的打击

无论如何,您必须完全理解angularJSrequireJS的概念。

<script src="http://cdn.gse.site/angular/1.2.9/angular.js"></script>
<script src="js/angular-ui-router.js"></script>
<script src="js/services/angDashboardService.js"></script>
<script src="js/controllers/angDashboardController.js"></script>

这意味着您已经有一个角度应用运行。所以你不会(不应该)使用requireJS

配置或加载角度
require.config({
   baseUrl: 'js',
   paths:{
      'async-module' : '...'
   },

   // You won't use 'shim' with this structure
   // shim: {}

});

<强> async-module.js

// assuming somewhere you have did this
// var app = angular.module([...]);
//
// NOW you need to convert this 'app' to global variable. So you can use it it requirejs/define blocks
// window.app = angular.module([...]);

define(function(){
  window.app.controller('asyncCtrl', function($scope){
    // controller code goes here
  });
});

然后在您的应用内某处,当您要加载此async-module

requirejs(['async-module'], function(){
    console.log('asyncCtrl is loaded!');
});

SUMARY&gt;&gt;

可以做你所要求的但是效果不高。在代码管理方面会像地狱一样。

  • 如果这个答案花费你的时间少于5分钟,你可以尝试一下。
  • 如果你花了超过5分钟的时间来理解。我强烈建议你不要这样做。以常见方式使用requireJS和angularJS(由requireJS加载的所有内容)已经很复杂和棘手。而这个用例甚至超出了这个范围。