如何消除由相对路径引起的重复需求?

How do I eliminate duplicate requires caused by relative paths?

本文关键字:需求 何消 相对 路径      更新时间:2023-09-26

在使用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.coffeeapp/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年前的航班代码。

  1. 为什么你提供requireLib grunt插件?你不需要这样做,因为grunt插件应该自己加载。结果将是两个需要加载的库,这只是混淆。

  2. Shim配置意味着仅与非AMD模块一起使用,但是您正在shimming"应用程序"和飞行"索引",这两个都是AMD模块。

  3. 为了修复#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文件,将会有很大帮助。