Cómo excluir ciertos archivos RequireJS de la uglificación / optimización


Tengo un proyecto requirejs que está utilizando grunt para la construcción y el despliegue. Si no se usa ninguna optimización, la compilación funciona sin problemas y obtengo un gran archivo js para implementarlo en producción.

El problema que tengo es que tengo algunos frameworks externos (como AngularJS) donde ya tengo una versión minimizada/optimizada y no quiero optimizarla de nuevo.

Actualmente sin optimización incluyo la versión minificada de este framework a través de un configuración de ruta separada en mi archivo gruntfile. Mientras que en mi mayoría normal.js Tengo la versión no minificada para desarrollo.

Ahora quiero usar el optimizador para optimizar mi propio código, pero NO para optimizar los frameworks externos. Pero los marcos externos deben incluirse en el gran archivo javascript resultante. Básicamente quiero decirle al optimizador que debe usar el archivo original en algunos casos.

Puedo hacer algo como esto?

Solo he encontrado una exclusión global opción, por lo que algunos módulos no están incluidos en el js optimizado resultante en absoluto.

Esta es mi configuración de grunt:

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%>"
                    }
                }
            }
        },

Y esta es la parte relevante de la principal.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' }
        }
    });

Gracias por cualquier ayuda.

Author: Marco Rinck, 2013-05-13

2 answers

Solo algunas sugerencias usan empty: para indicar NO para incluir el módulo en la optimización.

En requerir.config indicará entonces el uso del archivo min.

requirejs: {
            compile: {
                options: {
                    {{ all other settings }}
                    paths: {
                        'angular':'empty:',
                    }
                }
            }
        },

   require.config:{  
              paths:{
              'angular':'../external-libs/min/angular-1.0.4',
        },
   }

Tenga en cuenta que es " vacío:" con dos puntos al final, no "vacío". Si omites los dos puntos, obtendrás un error como este:

"No such file or directory [...]/empty.js" 

Espero que esto ayude.

 19
Author: Ian Lim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-13 13:07:32

Estaba teniendo el mismo problema de que las bibliotecas externas siempre se redimensionaban como los comentarios a la respuesta, y este es el método que uso para evitar eso. Tengo dos tareas, una para mi código y otra para las bibliotecas externas. Realmente es solo copiar archivos so por lo que una tarea de copia también funcionaría. También utilizo el keywork" empty: "para las bibliotecas externas para que no estén incluidas en las minificaciones de mi código.

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'
        }
    }
}
 5
Author: Matt Holcomb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-12 10:49:30