10

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

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

在 github 上创建了一个准系统项目,以重现该问题。

文件结构:

  • main.js
  • 索引.html
  • 日志.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');
});

构建生产.js:

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

索引.html:

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

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

加载 main.js
加载加载的 main

但它只打印出第一行

加载 main.js

有谁知道,为什么会这样?

4

2 回答 2

9

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

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

<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'):主要
  • 编译(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.

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

name: 'main.js'

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

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

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

于 2013-04-02T15:32:20.337 回答
0

聚会迟到了,但我认为这对可能正在寻找类似解决方案的其他人有用。我决定在此处发布以用于文档目的。

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

于 2018-04-10T08:08:54.483 回答