【问题标题】:concatenate requirejs modules into single file将requirejs模块连接到单个文件中
【发布时间】:2013-03-23 18:08:54
【问题描述】:

我正在尝试将我所有的需求模块和一些文本模板连接到一个连接和丑化的 main.min.js 中,以便我可以将该文件包含在我的 HTML 中。

我想出了连接和丑化部分。但是,我无法在浏览器中实际运行任何代码。

我创建了一个bare-bone project on github,以重现该问题。

文件结构:

  • main.js
  • index.html
  • log.js
  • 构建-生产
  • lib/require.js
  • node_modules/require/bin/r.js

我使用构建文件 build-production 连接 main.js、log.js 和 require.js:

./node_modules/requirejs/bin/r.js -o build-production.js

main.js

require.config({
    paths: {
        requireLib : 'lib/require/require'
    },
    waitSeconds: 1000
});

console.log('loading main.js');

define(function(require) {
    var log = require('log');
    console.log('loaded')

    log.fine('main loaded');
});

build-production.js:

({
    mainConfigFile : 'main.js',
    include : [ 'requireLib' ],
    name : 'main.js',
    out : 'main.min.js' })

index.html:

<script src="main.min.js" type="text/javascript"></script>

所以浏览器中的 index.html 应该打印出来

加载 main.js
加载 加载主

但它只打印出第一行

加载 main.js

谁知道,为什么会这样?

【问题讨论】:

  • 您可能需要在构建文件中定义paths: { requireLib : 'lib/require/require' }。见here
  • 感谢@c24w。 requireLib 应该取自我的 main.js,因为我指定了mainConfigFile : 'main.js'。反正我试过了。没用

标签: javascript requirejs


【解决方案1】:

聚会迟到了,但我认为这对其可能正在寻找类似解决方案的其他人有用。我决定在这里发帖以供记录。

还有browserify 可以满足您的需求。它的用法类似于 require(在 npm 上),但您可以在浏览器端使用它。我发现它很有用。

【讨论】:

    【解决方案2】:

    我刚刚仔细查看了您的代码。

    我不确定您为什么要使用以下方式加载缩小文件:

    <script src="main.min.js" type="text/javascript"></script>
    

    它仍然是一个 AMD 模块,因此需要使用 AMD 加载程序加载(否则 define 不会得到处理)。

    这行得通:

    <script type="text/javascript" src="lib/require/require.js"></script>
    <script type="text/javascript">
        require(['main.min'], function () {
            require(['main'], function () {});
        });
    </script>
    

    编辑:虽然外部 require 加载到缩小文件(包含所有模块)中,但您还需要第二个嵌套的 require 来加载仍称为 main的实际模块>.

    将单个模块命名为main,然后将所有模块的缩小版本命名为main.min,这是非常具有误导性的。例如,我可能希望 mainmain.min 完全相同,但没有应用任何优化。您可以考虑重命名为:

    • 入口点:myApp
    • 编译 (optimize: 'none'): main
    • 已编译 (optimize: 'uglify2'):main.min

    编辑 2: 在您的构建文件中:

    name: 'main.js'name: 'main'

    这将使 requirejs 将该模块命名为 main

    define('main.js', ...);define('main', ...);

    现在:require(['main']) 在已编译文件的本地范围内查找(并加载)名为 main 的模块。

    之前:require(['main']) 没有找到名为 main 的模块(它被命名为 main.js),因此将其视为文件名并加载 ./main.js .

    Edit 3:替代Edit 2,您可以在构建文件中保留:

    name: 'main.js'

    并为构建配置或运行时配置添加路径别名:

    paths: { 'main' : 'main.js' }

    (这种随意的想法没有任何保证。)

    【讨论】:

    • 感谢@c24w。您发布的解决方案不会加载连接脚本,而是单独加载所有模块。因此,在我的 chrome 的 web 开发人员工具 > 资源 > 脚本中,您会看到 log.js 和 main.js 已加载。我只想加载一个包含所有模块的文件
    • 再次感谢。这项工作几乎完美无缺。最后一件事:主模块(main.js)被加载了两次。一次在连接文件 myApp.js(之前的 main.min.js)中,一次在模块本身中。只有模块本身被执行,然后从 myApp.js 加载任何其他模块
    • 再次更新 - 很难记住我所做的所有小调整! Requirejs 很快就会变得一团糟 :(
    • 哇,谢谢!实际上,在构建文件中将 main.js 重命名为 main 是一个相当大的技巧。 'name' 的值显然用于两个完全不同的目的。首先,它用于查找应用程序的入口点,即主文件。但另外,由于 requirejs 的查找算法,我们可以使用它来加载模块。
    • 是的......我实际上并不知道让这种设置工作的最佳方法,但在压力很大并阅读了示例配置文件之后,这是我能做到的最好的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多