【问题标题】:Requirejs - Share the same dependency through different modulesRequirejs - 通过不同的模块共享相同的依赖
【发布时间】:2013-06-06 16:09:07
【问题描述】:

想象一下这个项目的脚手架:

  • utils.js
  • module1/controllers.js
  • module1/services.js
  • module2/controllers.js
  • module2/services.js

utils.js

define([], function(){  /* My utils functions */ });

module1/controllers.js

define(['../utils'], function(utils){  /* Module1 stuff */ });

module2/controllers.js

define(['../utils'], function(utils){  /* Module2 stuff */ });

这在非优化上下文中非常有效,因为 utils.js 只下载一次,无论是来自模块 1 还是模块 2。但是我需要将每个模块优化并打包在一个 JS 文件中。

为了得到这个,我在每个模块中添加了一个 main.js 文件,例如:

module1/main.js

define(['./controllers', './services.js'], function(){});

现在我开始玩优化工具,这是我的 app.build.js

...
modules: [
        { name: "module1/main" },
        { name: "module2/main" },
    ]
...

好的,我得到了我想要的行为,但我看到两个模块都包含 utils.js 代码。这种行为是正确的,因为您无法保证加载顺序。

所以,这些是我的问题:

  1. 是否存在任何智能解决方案?
  2. 如果不能跳过,有人知道 requirejs 在后台是如何工作的吗?这种策略会产生任何问题吗?

【问题讨论】:

    标签: javascript requirejs frontend r.js


    【解决方案1】:

    最后我使用构建脚本中的排除选项得到了答案:

    ...
    modules:[
      { name: 'utils' },
      { name: 'module1/main', exclude: ['utils'] }
      { name: 'module2/main', exclude: ['utils'] }
    ]
    ...
    

    这样,我为实用程序创建了一个单独的模块,并避免使用“排除”选项将其包含在其他模块代码中。此方法强制您手动编写这种“全局”依赖项,但它有效:)

    【讨论】:

      【解决方案2】:

      不确定您是如何“玩”优化工具的,但是当我有一个基本库(就像我的所有主干扩展一样)时,我会这样处理它,然后是一两个视图:

      基础库:类似于“base.js”

      define([
      'foo',
      'bar',
      'baz'
      ]);
      

      页面 x 的代码:假设是“x.js”

      define([
          'foo',
          'bar'
      ], function () {
      
      });
      

      根据需要设置“libraryBuild.js”文件和“build.js”文件 - 两者的区别在于 build.js,您需要将“base.js”中定义的所有文件设置为'空'。

      libraryBuild.js

      ({
          baseUrl: ".",
          name: "base",
          out: "base-built.js"
      })
      

      构建.js

      ({
          baseUrl: ".",
          paths: {
              foo: "empty:",
              bar: "empty:",
              baz: "empty:"
          }
      })
      

      现在,运行两次优化(我通过 npm 安装了 requirejs 作为全局包,所以我可以调用 r.js - 否则它将是 node ../path/to/r.js)。

      r.js -o libraryBuild.js

      r.js -o build.js name=x out=x-optimized.js(请注意,您可以将其应用于整个项目,而不仅仅是单个文件。但目前这是一个更好的示例)

      您应该注意到“x-optimized.js”文件不包含在 base-built.js 中设置的代码。

      那么,在你的页面中...

      <script>
      require.config({
          paths: {
              base: "base-built"
          }
      });
      require(['base'], function () {
          require(['x'], function (x) {
              //The stuff you'd normally do when X is included
          })
      });
      </script>
      

      我确信有更好的方法可以做到这一点,但这至少确实有效并且可以减小文件大小。

      【讨论】:

      • 感谢您的回复斯蒂芬,但我不确定这就是我要找的...我已经用更多信息编辑了我的问题:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多