如何消除由相对路径引起的重复需求?
How do I eliminate duplicate requires caused by relative paths?
在使用grunt-contrib-requirejs
任务优化我的require.js项目时,由于相对路径,许多脚本需要多次。下面是构建过程中输出的依赖项列表:
components/requirejs/require.js
.tmp/scripts/../../components/flight/lib/././utils.js
.tmp/scripts/../../components/flight/lib/./././utils.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/../../lib/./utils.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/../../lib/registry.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/../../lib/utils.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/debug.js
.tmp/scripts/../../components/flight/lib/././compose.js
.tmp/scripts/../../components/flight/lib/./advice.js
.tmp/scripts/../../components/flight/lib/./utils.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/../../lib/./utils.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/../../lib/registry.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/../../lib/utils.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/debug.js
.tmp/scripts/../../components/flight/lib/./compose.js
.tmp/scripts/../../components/flight/lib/./registry.js
.tmp/scripts/../../components/flight/lib/component.js
注意utils.js
被包含了7次:
.tmp/scripts/../../components/flight/lib/./utils.js
.tmp/scripts/../../components/flight/lib/././utils.js
.tmp/scripts/../../components/flight/lib/./././utils.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/../../lib/utils.js
.tmp/scripts/../../components/flight/lib/./../tools/debug/../../lib/./utils.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/../../lib/utils.js
.tmp/scripts/../../components/flight/lib/././../tools/debug/../../lib/./utils.js
飞行需要utils.js
在每个脚本在他们的lib
与./util
的路径,有时需要其他依赖关系,然后需要./util
再次。
grunt-contrib-requirejs
将它们的选项直接传递给需求,其中包括一个函数trimDots
,该函数应该"[修剪]"。和. .从路径段数组中。"
为什么不处理一些明显的重复?
我怎么做才能消除相对路径等于相同绝对路径的其他重复?
如果相对路径归一化为绝对路径,那么一切都很好。
更新:
这是我的项目的结构:
.tmp/scripts/ (where coffeescript is compiled)
app/scripts/ (coffeescript source)
components/ (bower components)
dist/ (where optimized code is output)
Gruntfile.coffee (requirejs config)
这是我的需求配置从我的Gruntfile:
requirejs:
dist:
options:
baseUrl: '.tmp/scripts'
# paths relative to baseUrl
paths:
requireLib: '../../components/requirejs/require'
include: 'requireLib'
optimize: 'uglify2'
generateSourceMaps: true
preserveLicenseComments: false
useStrict: true
wrap: true
name: 'main'
out: 'dist/main.js'
mainConfigFile: '.tmp/scripts/main.js'
app/scripts/main.coffee
:
require.config
paths:
# required dependencies
jquery: '../../components/jquery/jquery'
es5shim: '../../components/es5-shim/es5-shim'
es5sham: '../../components/es5-shim/es5-sham'
# plugins
text: '../../components/requirejs-text/text'
pickadate: '../../components/pickadate/source/pickadate.legacy'
map:
'*':
'flight/component': '../../components/flight/lib/component'
shim:
'../../components/flight/lib/index':
deps: ['jquery', 'es5shim', 'es5sham']
'app':
deps: ['../../components/flight/lib/index']
require ['app'], (App) ->
App.initialize()
app/scripts/app.coffee
:
define [
'ui/apple',
'ui/orange'
], (Apple, Orange) ->
initialize = ->
Apple.attachTo document
Orange.attachTo document
return
initialize: initialize
app/scripts/ui/apple.coffee
和app/scripts/ui/orange.coffee
都是:
"use strict"
define ['flight/component'], (defineComponent) ->
apple = ->
# stuff
defineComponent apple
尝试在grunt-contrib- requires选项中设置baseUrl:
requirejs: {
compile: {
options: {
baseUrl: "path/to/base"
}
}
}
记录。
我看到你的代码中有几件事引起了问题。我知道这个问题是在三年前提出的,所以这些担忧在当时可能并不适用。但我回到过去,在回答之前看了3年前的航班代码。
-
为什么你提供
requireLib
grunt插件?你不需要这样做,因为grunt插件应该自己加载。结果将是两个需要加载的库,这只是混淆。 -
Shim配置意味着仅与非AMD模块一起使用,但是您正在shimming"应用程序"和飞行"索引",这两个都是AMD模块。
-
为了修复#2并使您的代码更简单,您可以完全删除shim并简单地映射所有与"flight"相关的内容:
# main.coffee require.config paths: # required dependencies jquery: '../../components/jquery/jquery' es5shim: '../../components/es5-shim/es5-shim' es5sham: '../../components/es5-shim/es5-sham' # plugins text: '../../components/requirejs-text/text' pickadate: '../../components/pickadate/source/pickadate.legacy' map '*': 'flight': '../../components/flight/lib' require ['jquery', 'es5shim', 'es5sham'], (App) -> require ['app'], (App) -> App.initialize() # app.coffee define [ 'flight/index', 'ui/apple', 'ui/orange' ], (Apple, Orange) -> initialize = -> Apple.attachTo document Orange.attachTo document return initialize: initialize
我不确定这是否会解决你的问题,所以如果你能上传一个带有相关代码的小zip文件,将会有很大帮助。
- “createImageData()”和“new ImageData(()”有何不同
- 如何在使用webpack时不解决需求
- 消隐数组元素是否生成自己的属性
- RequireJS糖用于主要需求
- Javascript获取元素背景图像,但消除了“;url()”;
- 如何为多个需求模块设置单元测试
- 我可以在运行时使用 webpack 手动管理需求的分辨率吗?
- 这与 $(document).ready() 有何不同
- XUL文档与HTML文档对象有何不同
- Javascript对象:这两个值有何不同
- 什么是声明性环境记录,它与激活对象有何不同
- 微调 megamenu 的 jQuery 需求
- 响应式 Web 开发与渐进式 Web 开发有何不同
- 需求.js + 骨干优化
- 这个最终数字从何而来
- Sencha Touch 2 它与我对 html5/javascript Web 开发的知识有何关系
- RequireJS - 全局需求和模块需求之间的差异
- 如何在浏览器中使用需求
- 在 NodeJS 中处理太多的需求
- 我的 for 循环中的这些小数从何而来