Как исключить определенные файлы 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' }
        }
    });

Спасибо за любую помощь.


person Marco Rinck    schedule 13.05.2013    source источник


Ответы (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" 

Надеюсь это поможет.

person Ian Lim    schedule 13.06.2013
comment
Это решение не работает для меня с использованием grunt 0.4.1 и grunt-contrib-requirejs 0.4.1 Когда я указываю пусто: файл все еще включается в процесс uglify (используя uglify/uglify2). Я получаю одинаковые результаты независимо от того, оптимизирую ли я один файл или весь каталог приложения. - person Chris Goodchild; 03.11.2013
comment
Грунт 0.4.5, требует 2.1.9. Работает как шарм! - person Gabriel Lupu; 04.03.2015
comment
Получение ошибки при поиске «empty.js» — Grunt v0.4.5, requirejs 2.1.15 - person kevnk; 31.03.2015

У меня была та же проблема с внешними библиотеками, которые всегда повторно минифицируются, как комментарии к ответу, и это метод, который я использую, чтобы обойти это. У меня есть две задачи: одна для моего кода и одна для внешних библиотек. На самом деле это просто копирование файлов, так что просто задача копирования тоже сработает. Я также использую ключ «пусто:» для внешних библиотек, чтобы они не включались в минимизацию моего кода.

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'
        }
    }
}
person Matt Holcomb    schedule 12.03.2014
comment
Я не мог заставить работать свойство fileExclusionRegExp, но запуск двух последовательных задач requirejs с разными baseUrl и dir был ключом к тому, чтобы заставить мою работать! Спасибо! - person kevnk; 31.03.2015