【问题标题】:RequireJS - Unsure how to compile to a single file correctlyRequireJS - 不确定如何正确编译到单个文件
【发布时间】:2015-10-30 22:06:39
【问题描述】:

我试图将两个 js 文件——main.js 和 cookies.js——编译到一个文件中。

    -/
     |-main.js
     |-cookie.js
     |-require.js
     |-main-built.js
     |-build.js

main.js 包含脚本逻辑并依赖/需要 cookie.js。

如果我先加载 cookie.js 再加载 main.js,那么如果没有 require.js,一切都会很好。即:

    <script src="cookie.js"></script>
    <script src="main.js"></script>

这适用于开发,但我需要一个最终的 js 文件用于生产。

我开始尝试使用 require.js (http://requirejs.org/)

        <script data-main="main-built.js" src="require.js"></script>

其中main-built.js是运行的单个文件输出结果:

    node r.js -o build.js

我的构建文件设置如下:

    ({
      include: ["cookiejs","requirejs"],
      baseUrl: '.',
      paths: {
      'cookiejs': 'cookie',
      'requirejs': 'require'
    },
      name:"main",
      out: "main-built.js",
    })

"main" 从构建文件中拉入 main.js, "require" 引入 require.js, "cookie" 引入 cookie.js。

问题 当执行最终编译的文件时,cookie 函数没有定义。具体来说,由于 cookie.js 处理 cookie 交互,因此错误是:

    "Uncaught ReferenceError: cookie is not defined"

我可以看到 cookie.js 代码实际上被复制到 main-built.js 中,所以我认为这是如何告诉 require.js main.js 依赖于 cookie.js 并让编译器重新排序执行的问题最终主构建文件中的代码,但我真的抓住了如何告诉 require.js 如何做到这一点的稻草。

我尝试了什么

  • 在构建文件中包含和排除 require.js 并没有发现任何区别。

  • 在构建文件中使用“deps”而不是“include” --- 我没有发现区别

  • 各种 uglify 构建选项

【问题讨论】:

  • shim config 获得战利品
  • 感谢 Vishwanath - 作为依赖项的 cookie.js 文件设置为使用 AMD 加载程序(如果存在),似乎 shim 配置适用于不使用“define()”声明的旧脚本模块化值。这被定义为 cookie。
  • 您错过了使用 shim 进行依赖配置。我将在答案中添加。

标签: requirejs


【解决方案1】:

因为你的主要依赖于 cookiejs。您必须通过 requirejs 配置来定义这种关系。理想情况下,这些依赖项应该在依赖文件中定义,如下所示。

main.js

define(['cookie'], function(){
});

您还可以使用 shim 来定义您无法控制的文件(这里不是这种情况)。

({
      include: ["cookiejs","requirejs"],
      baseUrl: '.',
      paths: {
      'cookiejs': 'cookie',
      'requirejs': 'require'
    },
      name:"main",
      out: "main-built.js",
      shim : {
         "main" : ["cookiejs"] //This means main depends on cookie
      }
    })

【讨论】:

  • 感谢您的帮助 Vishwanath。在你第一次发表评论后,我实际上尝试了这个精确的垫片添加,并且一直在尝试几种变体,但没有运气。因为发生相同的浏览器错误。 “cookie 未定义”
  • 您是否重新运行了优化器,清除了浏览器缓存?
  • 是的先生 - 删除了构建的文件 - 清除了浏览器缓存(尽管它设置为在控制台打开时不缓存) - 重建文件,在浏览器中重新加载,仍然是同样的错误......
  • 抱歉把你当菜鸟了。没有看到任何其他问题,因此问您我们是否在同一条车道上。你可以保留uglify : none 并检查构建文件的内容。文件连接的顺序。
  • 不用担心 - 我是 require.js 的新手 - 并且一直在学习。我设置了 uglify : none 但它似乎仍在连接,似乎构建的文件以 main.js 文件开头,然后插入 cookie.js,然后以剩余的 main.js 文件结束。
猜你喜欢
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
相关资源
最近更新 更多