При оптимизации моего проекта 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
Мой товарищ по команде выкопал в r.js, включенный в модуль узла [requirejs node] (https://github.com/jrburke/r.js), и подтвердил, что они не нормализуют пути таким образом, чтобы исключить дубликатов, которые у меня есть. Не уверен, что это предназначено или неверно. Если он сможет копать дальше, возможно, он может открыть проблему на GitHub. – maxbeatty
Я написал задачу grunt, называемую grunt-reduce, которая выполняет целую кучу оптимизаций на вашу страницу, включая правильное разрешение и минимизацию зависимостей requirejs. Если вы в порядке с другими запущенными оптимизациями, возможно, вам стоит попробовать, чтобы убедиться, что вы можете запустить его из коробки: https://github.com/Munter/grunt-reduce – Munter
ditch grunt and leverage webpack ... В частности, «DedupePlugin» будет делать именно то, что вам нужно. https://github.com/webpack/docs/wiki/optimization – Maxwelll