AngularJS and Webpack Integration

前端 未结 2 1445
生来不讨喜
生来不讨喜 2021-02-08 22:32

I am looking for some help with using webpack for a large AngularJS application. We are using folder structure based on feature (each feature/page has a module and they have con

2条回答
  •  深忆病人
    2021-02-08 23:11

    Sagar Ganatra wrote a helpful blog post about code splitting.

    Suprisingly code splitting isn't really supported by angular's module system. However, there is a way to achieve code splitting by saving a reference to angular's special providers during the config-phase.

    [...] when Angular initializes or bootstraps the application, functions - controller, service etc,. are available on the module instance. Here, we are lazy loading the components and the functions are not available at a later point; therefore we must use the various provider functions and register these components. The providers are available only in the config method and hence we will have to store a reference of these providers in the config function when the application is initialized.

    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
            };
    
        }
    ]);
    

    Now inside your loginController for instance you write

    app.components.controller('loginController');
    

    to define your new controller lazily.

    If you want to lazy-load your templates too I recommend to use the ui-router. There you can specify a templateProvider which is basically a function to load templates async

提交回复
热议问题