首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用oclazyload和webpack码分裂避免角路由中的代码重复

用oclazyload和webpack码分裂避免角路由中的代码重复
EN

Stack Overflow用户
提问于 2017-02-24 09:31:55
回答 1查看 218关注 0票数 0

我目前在一个项目中使用了角1.5,我的路由如下所示:

代码语言:javascript
复制
const routes = ($stateProvider) => {

  $stateProvider
    .state('update', {
      url: '/update',
      template: '<update></update>',
      resolve: {
        lazyload: [ '$q', '$ocLazyLoad', function ($q, $ocLazyLoad) {
             console.log('start lazy');
             let deferred = $q.defer();
             require.ensure([], function () {
             let module = require('../components/update/update.module');
               let module = require('../components/update/update.module');
               $ocLazyLoad.load({
                 name: module.default.name
               });
               deferred.resolve(module);
             });
             return deferred.promise;
           }
         ]
      }
    })
    .state('login', {
      url: '/login',
      template: '<login></login>',
      resolve: {
        lazyload: [ '$q', '$ocLazyLoad', function ($q, $ocLazyLoad) {
            let deferred = $q.defer();
            require.ensure([], function () {
              let module = require('../components/login/login.module');
              $ocLazyLoad.load({
                name: module.default.name
              });
              deferred.resolve(module)
            });
            return deferred.promise;
          }
        ]
      }
    });

};

当我试图在一个单独的函数中提取重复的代码时,如下所示:

代码语言:javascript
复制
function load (modulePath) {
    return function ($q, $ocLazyLoad) {
      let deferred = $q.defer();
      require.ensure([], function () {
      let module = require(modulePath);
        $ocLazyLoad.load({
          name: module.default.name
        });
        deferred.resolve(module);
      });
      return deferred.promise;
    }
  }

并以这种方式使用load函数:

代码语言:javascript
复制
$stateProvider
    .state('update', {
      url: '/update',
      template: '<update></update>',
      resolve: {
        lazyload: [ '$q', '$ocLazyLoad', load('../components/update/update.module')]
      }
    })

路由不再工作了,我得到了“找不到模块”的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-24 10:30:05

当使用动态需求时,不要在参数中包含路径和扩展。

将所需的延迟模块放在一个单独的文件夹lazy中。

代码语言:javascript
复制
function load (state) {
  return function ($q, $ocLazyLoad) {
    let deferred = $q.defer();
    require.ensure([], function () {
      let module = require('../components/lazy/' +state+ '.module');
      $ocLazyLoad.load({
        name: module.default.name
      });
      deferred.resolve(module);
    });
    return deferred.promise;
  }
}

$stateProvider
.state('update', {
  url: '/update',
  template: '<update></update>',
  resolve: {
    lazyload: [ '$q', '$ocLazyLoad', load('update')]
  }
})

您可以使用与建议的结构不同的结构。参考https://webpack.github.io/docs/context.html#dynamic-requires

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42435098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档