2013-04-16 3 views
10

При оптимизации моего проекта require.js с использованием задачи grunt-contrib-requirejs многие сценарии требуются несколько раз из-за относительных путей. Вот список зависимостей, выводимый в процессе сборки:Как устранить дубликаты, вызванные относительными путями?

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 

Flight требует utils.js в каждом сценарии в их lib с путем ./util и иногда требует другие зависимости, которые затем требуют ./util.

grunt-contrib-requirejs передает свои варианты непосредственно requirejs, который включает в себя функцию trimDots, которая должна «[обрезать] и .. из массива сегментов пути».

Почему это не касается некоторых очевидных дубликатов?

Что я могу сделать, чтобы устранить другие дубликаты, где относительный путь соответствует одному и тому же абсолютному пути?

Если относительные пути нормализуются к абсолютным путям, все будет хорошо.

Update:

Это как структурирована мой проект:

.tmp/scripts/ (where coffeescript is compiled) 
app/scripts/ (coffeescript source) 
components/ (bower components) 
dist/ (where optimized code is output) 
Gruntfile.coffee (requirejs config) 

Вот мои requirejs конфиг из моего 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 
+0

Мой товарищ по команде выкопал в r.js, включенный в модуль узла [requirejs node] (https://github.com/jrburke/r.js), и подтвердил, что они не нормализуют пути таким образом, чтобы исключить дубликатов, которые у меня есть. Не уверен, что это предназначено или неверно. Если он сможет копать дальше, возможно, он может открыть проблему на GitHub. – maxbeatty

+0

Я написал задачу grunt, называемую grunt-reduce, которая выполняет целую кучу оптимизаций на вашу страницу, включая правильное разрешение и минимизацию зависимостей requirejs. Если вы в порядке с другими запущенными оптимизациями, возможно, вам стоит попробовать, чтобы убедиться, что вы можете запустить его из коробки: https://github.com/Munter/grunt-reduce – Munter

+1

ditch grunt and leverage webpack ... В частности, «DedupePlugin» будет делать именно то, что вам нужно. https://github.com/webpack/docs/wiki/optimization – Maxwelll

ответ

0

Попробуйте установить BaseUrl в хрюкать-вно-requirejs варианты:

requirejs: { 
    compile: { 
     options: { 
      baseUrl: "path/to/base" 
     } 
    } 
} 

Документировано here.

+0

У меня уже есть 'baseUrl', установленный в' .tmp/scripts', так как именно здесь мой компилятор CoffeeScript. Я уточнил вопрос с более подробной информацией о моем макете проекта. – maxbeatty

0

Я вижу пару вещей с кодом, который вызывает вопрос. Я знаю, что этот вопрос был задан более трех лет назад, поэтому некоторые из этих проблем, возможно, не были применимы в то время. Но я пошел back in time и посмотрел код рейса от 3 лет назад, прежде чем ответить.

  1. Почему вы предоставляете requireLib плагину grunt? Вам не нужно это делать, поскольку плагин grunt должен загружать свой собственный. Результатом будет два запроса загрузки libs, что просто путает.

  2. Конфигурации прокладки предназначены для использования с non-AMD modules only, однако вы подбираете как «приложение», так и «индекс» полета, которые являются одновременно и модулями AMD. Я ожидал бы от этого странного поведения.

  3. Для того, чтобы исправить # 2 и сделать код более простым, вы можете удалить подкладку вообще и просто карту все «полет», связанные с:

    # 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-файл с соответствующим кодом, который поможет много.

Смежные вопросы