Javascript 如果我们在配置中定义了一些映射,如何使用requireJS优化项目?

Javascript 如果我们在配置中定义了一些映射,如何使用requireJS优化项目?,javascript,optimization,module,requirejs,Javascript,Optimization,Module,Requirejs,我的main中有一个require.config,如下所示 require.config({ baseUrl:'scripts/' paths:{ jquery:'shell/lib/jquery/jquery-1.7.1' // many libraries and modules are aliased here }, map:{ '*':{ 'underscore':'shell/lib/underscore/underscore'

我的main中有一个require.config,如下所示

require.config({
baseUrl:'scripts/'

 paths:{  
        jquery:'shell/lib/jquery/jquery-1.7.1'
     // many libraries and modules are aliased here

 },
 map:{
  '*':{
      'underscore':'shell/lib/underscore/underscore'
            // a few other modules are mapped here
  }
 }     
}))

我这样做是因为map中定义的文件使用内部依赖关系(在各自的文件夹中)和相对路径。 现在,当我运行optimizer时,路径中定义的模块被保存为模块ID,就像jquery保存为jquery一样,而映射中的模块则获得完整的路径,比如“下划线”被保存为“shell/lib/下划线/下划线”,而不是“下划线”

这会导致问题,因为我在其他模块中也使用了“下划线”,而优化后的文件使用的是“下划线”而不是“shell/lib/下划线/下划线”

当我们提供地图配置或我缺少的东西时,是否有一些具体的优化方法?请告诉我怎么修


谢谢

我不确定是否理解这个问题:

这会导致问题,因为我在其他模块中也使用了“下划线”,而优化后的文件使用的是“下划线”而不是“shell/lib/下划线/下划线”

这似乎是预期的行为,您将所有模块的
下划线
映射到该路径。因此,基本上你是在告诉
r.js
:每次你找到
下划线
依赖项时,把它重写为
shell/lib/下划线/下划线
。如果您的模块使用“内部路径”,并且您希望执行相反的操作(使它们引用
下划线
),则需要执行相反的映射:

 'some/path/underscore': 'underscore'
在这种情况下,所有模块都将指向同一个下划线模块。甚至那些使用一些奇怪路径作为下划线的

在极端情况下,您需要控制
r.js
如何在磁盘上写入模块。您可以使用
onBuildWrite
属性(请参阅)

例如:

onBuildWrite: function ( moduleName, path, contents ) {
    if ( path === './src/somefile.js' ) {
          return contents.replace(/^define\('src\/underscore'/, "define('underscore'");
    } else {
          return contents;
    }
}

这个例子是一个告诉
r.js
的“黑客”:当你处理
somefile.js
时,用
下划线替换
src/下划线
(这正是你对map所做的…但只是告诉你如何使用
onBuildWrite
来做讨厌的事情).

不太清楚为什么要在地图中添加下划线。当应用程序中的不同模块依赖于不同版本的下划线时,映射非常有用。如果所有应用程序都依赖于一个版本的下划线,请将其放在输入路径中。请在评论中澄清,我会尽力帮助您。此下划线是一个包装器.js文件,写在下划线库上,上面写着require[(“/下划线-1.3.3”)…之所以这样做,是因为一个团队测试并定义了要使用的开源库,而其他团队使用它们。在编写开源库(如Animation.js)的自定义扩展时,也可以使用这种实现。提前感谢。