【问题标题】:How can I minify an ExtJs 5 project without Sencha?如何在没有 Sencha 的情况下缩小 ExtJs 5 项目?
【发布时间】:2016-05-13 14:22:29
【问题描述】:

我一直在研究在没有 Sencha 的情况下缩小 ExtJS 应用程序的能力,我最接近的是这个链接:

Is there a way to minify an ExtJS application without Sencha CMD?

但是,我不确定如何在后面的 cmets 中执行该文件。我正在使用带有 com.samaxes.maven 和 CLOSURE 引擎的 minify-maven-plugin。我能够生成整个项目的缩小 js 文件,但是当我尝试加载网页时出现错误。

我能够验证网页正在调用正确的文件。我收到错误“TypeError: q is undefined”...根本没有帮助。如果没有压缩文件,Web 应用程序可以完美运行。所以,生成的缩小文件一定有问题。

上面链接底部的建议指出了我应该包含的文件序列,但我不知道如何实际实现它。此外,可能有超过一百个 javascript 文件需要缩小,所以我宁愿不必在 jsb 文件中键入每个文件。

对于如何在构建时使用 maven 缩小我的整个项目有什么建议吗?

【问题讨论】:

    标签: javascript maven extjs minify


    【解决方案1】:

    我正在使用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 的缩小器几乎可以在默认设置下为我工作,我只需要对我的代码(与全局函数相关)进行一些小的更改。

    【讨论】:

    • +1 @serg。这是很好的信息!我正在查看 Maven 文档并意识到出了什么问题。缩小器只是试图缩小特定文件夹,而不是需要缩小的文件夹。我需要更改要缩小的源文件夹。我也确实需要确保我以正确的顺序缩小文件夹,最后是 app.js,就像你说的那样。我还在 requires 语句中添加了条件,这是一个巨大的帮助!这使我能够设置配置文件以使用缩小的应用程序或普通应用程序进行故障排除。
    【解决方案2】:

    虽然我不确定您为什么想要这个,但您需要的主要是所谓的依赖树 - 它告诉您包含源文件的顺序。

    然后您可以将所有文件(ExtJS 源代码、库(如果适用)以及您自己的视图)以正确的顺序放入一个大文件中。然后,该文件应与 500 个不同的文件完全相同。 (对我有用。)

    完成后,您可以搜索一个工作的缩小器。不是每个 minifier 都可以缩小 ExtJS 代码,我不记得在我们最终决定切换到 Sencha Cmd 之前的最后结果,但我认为 Microsoft Javascript Minifier 对我们有用。

    除此之外,缩小的 JavaScript 确实清晰易读。您应该提供错误的来源,错误前 200 个字符和错误后 200 个字符,我想这里有人可以告诉那里发生了什么。

    【讨论】:

    • 我想缩小文件,因为 ExtJS 很慢,需要优化。我想避免手动输入所有文件,但似乎我做不到,因为我总是遇到很多错误。我目前正在为我的 css 文件使用压缩器,效果很好。我与 ExtJS 一起使用的所有文件都是 *.js 文件,因此我实际上正在浏览整个项目并试图找出加载文件的正确顺序。然后修改 pom.xml 文件以具有正确的顺序。感谢您的回复,我真的很感激。我即将完成这项艰巨的任务!
    猜你喜欢
    • 2015-06-16
    • 2023-03-11
    • 1970-01-01
    • 2011-08-28
    • 2011-10-22
    • 2015-05-07
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    相关资源
    最近更新 更多