9

我正在为大型 AngularJS 应用程序使用webpack寻求帮助。我们使用基于功能的文件夹结构(每个功能/页面都有一个模块,它们有控制器、指令)。我已成功配置 webpack 以使其与 Grunt 一起使用,它会生成一个单独的包。我想创建块,因为它将成为一个大型应用程序,我们想异步加载模块(页面/功能)工件。

我正在浏览一些 webpack 示例以使用'code splitting'usingrequire([deps],fn )语法。但是我无法让块延迟加载。首先,我不知道具体在哪里,我需要在 AngularJS 将用户路由到下一页之前导入这些块。我正在努力寻找明确的责任分离。

有人向我指出了一个示例 AngularJS 应用程序,其中 webpack 用于在每个路由之后异步加载控制器/指令/过滤器?

我关注的链接很少: 我应该使用 Browserify 还是 Webpack 在 Angular 1.x 中延迟加载依赖项 https://github.com/petehunt/webpack-howto#9-async-loading http://dontkry.com /posts/code/single-page-modules-with-webpack.html

4

2 回答 2

13

Sagar Ganatra 写了一篇关于代码拆分的有用博客文章。

令人惊讶的是,Angular 的模块系统并不真正支持代码拆分。但是,有一种方法可以通过在配置阶段保存对 Angular 的特殊提供程序的引用来实现代码拆分。

[...] 当 Angular 初始化或引导应用程序、功能 - 控制器、服务等时。在模块实例上可用。在这里,我们延迟加载组件,并且功能稍后不可用;因此我们必须使用各种提供者功能并注册这些组件。提供程序仅在 config 方法中可用,因此我们必须在初始化应用程序时将这些提供程序的引用存储在 config 函数中。

window.app.config([
    '$routeProvider',
    '$controllerProvider',
    '$compileProvider',
    '$filterProvider',
    '$provide',
    function ($routeProvider, $controllerProvider, $compileProvider, $filterProvider, $provide) {

        $routeProvider.when('/login', {
            templateUrl: 'components/login/partials/login.html',
            resolve: {
                load: ['$q', '$rootScope', function ($q, $rootScope) {

                    var deferred = $q.defer();

                    // lazy load controllers, etc.
                    require ([
                        'components/login/controllers/loginController',
                        'components/login/services/loginService'
                    ], function () {

                        $rootScope.$apply(function () {
                            deferred.resolve();
                        });

                    });

                    return deferred.promise;
                }]
            }
        });


        //store a reference to various provider functions
        window.app.components = {
            controller: $controllerProvider.register,
            service: $provide.service
        };

    }
]);

现在在你loginController的例子里面你写

app.components.controller('loginController');

懒惰地定义你的新控制器。

如果您也想延迟加载模板,我建议使用ui-router。在那里你可以指定一个templateProvider基本上是异步加载模板的函数

于 2014-10-21T22:54:13.103 回答
2

这是来自 https://github.com/webpack/webpack/issues/150的引用

webpack 是一个模块打包器,而不是一个 javascript 加载器。它从本地磁盘打包文件并且不从网络加载文件(除了它自己的块)。

使用 javascript 加载器,即 script.js

var $script = require("scriptjs");
$script("//ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular.min.js", function() {
  // ...
});
于 2015-01-26T17:50:22.380 回答