我正在使用Grunt 来构建项目,但这并不重要,因为您需要的只是组合文件,所以 maven 应该是有能力的。
我希望我的开发版本仍然依赖 Extjs 动态类加载器,这样我就不必在修改一个文件时重新构建项目,而只需将生产版本压缩成一个文件。在我让它工作之前有一些陷阱,这就是我最终得到的。这也适用于 ExtJS6,但它可能仍然应该是相同的。
它全部由后端变量dev 控制,当设置为false 时将使用缩小的源。
index.html(我以一些元模板语言为例)
<html>
<head>
{{if dev}}
<script src="/ext/ext-all-debug.js"></script>
{{else}}
<script src="/ext/ext-all.js"></script>
{{/if}}
<script>
var dev = {{dev}};
Ext.Loader.setConfig({enabled: dev});
</script>
{{if dev}}
<script src="/app.min.js"></script>
{{else}}
<script src="/app.js"></script>
{{/if}}
</head>
<body></body>
<html>
app 文件,requires 指令在动态加载器被禁用时无法正常工作,所以我不得不在任何地方添加这样的条件:
Ext.define('MyApp.view.Panel', {
extend: 'MyApp.view.GenericPanel',
requires: dev ? [
'MyApp.view.AnotherView',
] : [],
...
});
Gruntfile.js(如果您只需要连接,请在任何地方将 uglify 替换为 concat)
module.exports = function(grunt) {
grunt.initConfig({
pkg : grunt.file.readJSON('package.json'),
uglify : {
build: {
files: {
'../app.min.js': ['../app/view/GenericPanel.js', '../app/**/*.js', '../app.js'],
}
}
},
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.registerTask('default', [ 'uglify' ]);
};
grunt 的 project.json:
{
"name": "My App",
"version": "1.0.0",
"devDependencies": {
"grunt": "~0.4.5",
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-uglify": "^1.0.1"
}
}
文件的顺序很重要,默认情况下 grunt 将使用字母顺序。如果您扩展某个类,则必须包含更高的父类。 app.js 应该在最后。除此之外,它在单个混合文件中运行良好,因此我不必进一步自定义文件顺序。 Grunt 有相当强大的path patterns,所以如果您需要确保首先包含某个文件,您只需在其他路径模式之前列出它,它会足够聪明,不会包含它两次。
我建议您从不缩小的简单串联开始,并且只有在可行的情况下尝试缩小它。缩小时,您可能需要小心全局函数和变量,因为如果缩小器过于激进,它们可能会被重命名。 Grunt 的缩小器几乎可以在默认设置下为我工作,我只需要对我的代码(与全局函数相关)进行一些小的更改。