AngularJS and Webpack Integration

前端 未结 2 1447
生来不讨喜
生来不讨喜 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

    0 讨论(0)
  • 2021-02-08 23:15

    This is a quote from https://github.com/webpack/webpack/issues/150

    webpack is a module bundler not a javascript loader. It package files from local disk and don't load files from the web (except its own chunks).

    Use a javascript loader, i. e. script.js

    var $script = require("scriptjs");
    $script("//ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular.min.js", function() {
      // ...
    });
    
    0 讨论(0)
提交回复
热议问题