3

如果我使用 RequireJS 来优化我的整个项目,如果我使用设置 skipDirOptimize: true,我的主模块将不会得到优化/丑化。据我了解,除了非构建层 JS 文件外,所有内容都应该进行优化。这是一个错误还是我不理解这个参数的正确用法?

这是我的requirejs配置:

{
    appDir: '../project',
    mainConfigFile: '../project/assets/js/main.js',
    dir: '../httpdocs',
    optimize: "uglify",
    //Introduced in 2.1.2: If using "dir" for an output directory, normally the
    //optimize setting is used to optimize the build layers (the "modules"
    //section of the config) and any other JS file in the directory. However, if
    //the non-build layer JS files will not be loaded after a build, you can
    //skip the optimization of those files, to speed up builds. Set this value
    //to true if you want to skip optimizing those other non-build layer JS
    //files.
    skipDirOptimize: true,
    generateSourceMaps: false,
    normalizeDirDefines: "skip",
    uglify: {
        toplevel: true,
        ascii_only: true,
        beautify: false,
        max_line_length: 1000,
        defines: {
            DEBUG: ['name', 'false']
        },
        no_mangle: false
    },
    optimizeCss: "standard",
    removeCombined: true,
    modules: [
        {
            name: '../main'
        }
    ]
}
4

1 回答 1

0

在模块中使用相对路径可能会导致 r.js 在决定是否对其进行优化时无法将其识别为构建包。

我有一个类似的问题(构建包没有被优化),不是使用相对模块路径,而是使用路径配置来允许我的模块以与我的文件夹结构不同的方式命名:

({
    ...
    skipDirOptimize: true,
    paths: {
        'MyLibrary': ''
    },
    modules: [
       { name: 'MyLibrary/Main' }
    ],
    ...
})

这会导致 r.js (2.1.8) 中的模块名称变为/Main,因此当它构建其_buildPathToModuleIndex映射时,由于有两个斜杠(例如C:\dev\project\output\\Main),键将不正确。

优化循环决定一个模块是否是一个构建包(因此即使在 时也需要优化)的方式是通过使用它的文件名(例如)在映射中skipDirOptimize: true查找它。由于它在带有两个斜线的地图中,它不会找到它。因此,它不会被视为构建包,也不会被优化。_buildPathToModuleIndexC:\dev\project\output\Main

尝试将一些console.logs 放入 r.js 中它构建和访问的地方,_buildPathToModuleIndex以查看它放入了什么以及它用于查找它的内容。

对于我的问题,解决方案是为'MyLibrary/Main': 'Main'(不幸的是重复)添加路径条目。我不确定你的项目结构是什么,但是如果你设置baseUrl: '../然后简单地调用你的模块main呢?

于 2013-08-09T13:10:08.720 回答