Как исключить определенные файлы requireJS из увеличения / оптимизации
У меня есть работающий проект requirejs, который использует grunt для сборки и развертывания. Если оптимизация вообще не используется, сборка работает без проблем, и я получаю один большой js-файл для его развертывания на производстве.
У меня проблема в том, что у меня есть некоторые внешние фреймворки (например, angularJS), где у меня уже есть свернутая / оптимизированная версия, и я не хочу снова ее оптимизировать.
В настоящее время без оптимизации я включаю минимизированную версию этого фреймворка через отдельный конфиг в моем файле gruntfile. Тогда как в моем обычном main.js у меня есть неунифицированная версия для разработки.
Теперь я хочу использовать оптимизатор для оптимизации собственного кода, но НЕ для оптимизации внешних платформ. Но внешние рамки должны быть включены в получившийся большой файл javascript. В основном я хочу сказать оптимизатору, что он должен использовать оригинальный файл в некоторых случаях.
Могу ли я сделать это как-то так?
Я нашел только глобальную опцию исключения, так что некоторые модули вообще не включаются в получившиеся оптимизированные js.
Это моя грубая конфигурация:
requirejs: {
compile: {
options: {
baseUrl: "<%= pkg.folders.jsSource %>",
name: "../external-libs/almond-0.1.1",
include: "main",
mainConfigFile: "<%= pkg.folders.jsSource %>/main.js",
out: "<%= pkg.folders.build + pkg.name + '-' + pkg.version %>/js/main.js",
//logLevel: 0,
optimize: "uglify2",
//optimize: "none",
paths: {
'angular':'../external-libs/min/angular-1.0.4',
'jquery':'../external-libs/min/jquery-1.7.2',
'jquery.mobile':'../external-libs/min/jquery.mobile-1.2.0',
'adapter': '../external-libs/min/jquery-mobile-angular-adapter-1.2.0',
'moment': '../external-libs/moment-1.6.2.min',
'iscroll': '../external-libs/min/iscroll-4.2.5',
'iscrollview': '../external-libs/min/jquery.mobile.iscrollview-1.2.6',
'add2Home': '../external-libs/min/add2home',
'config/config': "config/<%=configDatei%>"
}
}
}
},
И это соответствующая часть main.js:
require.config({
paths:{
'angular':'../external-libs/angular-1.0.4',
'jquery':'../external-libs/jquery-1.7.2',
'jquery.mobile':'../external-libs/jquery.mobile-1.2.0',
'adapter': '../external-libs/jquery-mobile-angular-adapter-1.2.0',
'moment': '../external-libs/moment-1.6.2.min',
'iscroll': '../external-libs/iscroll-4.2.5',
'iscrollview': '../external-libs/jquery.mobile.iscrollview-1.2.6',
'add2Home': '../external-libs/add2home'
},
shim:{
'angular':{ deps:['jquery'], exports:'angular' },
'iscroll':{ deps:['jquery'], exports:'iscroll' },
'iscrollview':{ deps:['jquery.mobile', 'iscroll'], exports:'iscrollview' }
}
});
Спасибо за любую помощь.
2 ответа
Просто некоторые предложения используют пустой: для указания НЕ включать модуль в оптимизацию.
Затем в require.config будет указано использование файла min.
requirejs: {
compile: {
options: {
{{ all other settings }}
paths: {
'angular':'empty:',
}
}
}
},
require.config:{
paths:{
'angular':'../external-libs/min/angular-1.0.4',
},
}
Обратите внимание, что это "пусто" с двоеточием в конце, а не "пусто". Если вы пропустите двоеточие, вы получите ошибку, подобную этой:
"No such file or directory [...]/empty.js"
Надеюсь это поможет.
У меня была та же проблема, что внешние библиотеки всегда минимизировались, как комментарии к ответу, и это метод, который я использую, чтобы обойти это. У меня есть две задачи, одна для моего кода и одна для внешних библиотек. Это на самом деле просто копирование файлов - так что просто задача копирования также будет работать. Я также использую клавиатуру "empty:" для внешних библиотек, чтобы они не включались в минимизацию моего кода.
requirejs: {
options: {
mainConfigFile: '...',
fileExclusionRegExp '...common things to exclude...'
},
main: {
options: {
baseUrl: '.../js',
dir: '.../js-built',
fileExclusionRegExp: /^external$/,
... etc ...
}
},
external: {
options: {
baseUrl: '.../js/external',
dir: '.../js-built/external',
optimize: 'none'
}
}
}