如何从丑化/优化中排除某些 requireJS 文件
Posted
技术标签:
【中文标题】如何从丑化/优化中排除某些 requireJS 文件【英文标题】:How to exclude certain requireJS files from uglifying/optimizing 【发布时间】:2013-05-07 11:55:09 【问题描述】:我有一个使用 grunt 进行构建和部署的 requirejs 项目。如果根本不使用优化,构建工作没有问题,我会得到一个大的 js 文件来将它部署到生产环境中。
我遇到的问题是,我有一些外部框架(如 angularJS),我已经有了它的最小化/优化版本,不想再次优化它。
目前没有优化,我通过一个单独的路径配置在我的 gruntfile 中包含了这个框架的缩小版本。而在我正常的 main.js 中,我有用于开发的非缩小版本。
现在我想使用优化器来优化我自己的代码,但不优化外部框架。但是外部框架应该包含在生成的大 javascript 文件中。基本上我想告诉优化器在某些情况下他应该使用原始文件。
我可以这样做吗?
我只找到了一个全局排除选项,所以一些模块根本不包含在生成的优化 js 中。
这是我的 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%>"
,
这是 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'
);
感谢您的帮助。
【问题讨论】:
【参考方案1】:只是一些建议使用空:表示不将模块包含在优化中。
然后在require.config中会指明min文件的使用情况。
requirejs:
compile:
options:
all other settings
paths:
'angular':'empty:',
,
require.config:
paths:
'angular':'../external-libs/min/angular-1.0.4',
,
请注意,这是“empty:”,末尾有一个冒号,而不是“empty”。如果省略冒号,则会收到如下错误:
"No such file or directory [...]/empty.js"
希望这会有所帮助。
【讨论】:
此解决方案不适用于我使用 grunt 0.4.1 和 grunt-contrib-requirejs 0.4.1 当我指定“empty:”时,文件仍包含在 uglify 进程中(使用 uglify /丑陋2)。无论是优化单个文件还是整个应用程序目录,我都会得到相同的结果。 咕噜声 0.4.5,需要 2.1.9。像魅力一样工作! 在寻找“empty.js”时出错——Grunt v0.4.5,requirejs 2.1.15【参考方案2】:我遇到了同样的问题,即外部库总是被重新缩小为答案的 cmets,这是我用来解决这个问题的方法。我有两项任务,一项针对我的代码,一项针对外部库。它实际上只是复制文件——所以只需一个复制任务也可以。我还为外部库使用了“空:”键,因此它们不包含在我的代码的缩小中。
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'
【讨论】:
我无法让fileExclusionRegExp
属性正常工作,但是使用不同的baseUrl
和dir
运行两个连续的requirejs 任务是让我的工作正常的关键!谢谢!以上是关于如何从丑化/优化中排除某些 requireJS 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何从 UseStatusCodePagesWithReExecute 中排除某些路由?