【问题标题】:How to properly use minify maven plugin to minify js and css in Angularjs app?如何正确使用 minify maven 插件来缩小 Angularjs 应用程序中的 js 和 css?
【发布时间】:2015-02-27 12:26:17
【问题描述】:

我正在尝试使用 samaxes minify maven plugin 在我的 angularjs 应用程序中缩小 javascripts 和 css 文件。我能够缩小所有 js 和 css 并使用 maven 构建一个 war 文件,但是在尝试打开应用程序 url 时我得到 Error: [$injector:unpr] Unknown provider: aProvider <- a 并且我的应用程序无法运行。

下面我提供我的 pom 插件配置

<plugin>
    <groupId>com.samaxes.maven</groupId>
    <artifactId>minify-maven-plugin</artifactId>
    <version>1.7.4</version>
    <executions>
        <execution>
            <id>min-js</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>minify</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <charset>UTF-8</charset>
        <skipMerge>true</skipMerge>
        <cssSourceDir>myapp/styles</cssSourceDir>
        <jsSourceDir>myapp/javascript</jsSourceDir>
        <jsEngine>CLOSURE</jsEngine>
        <closureLanguage>ECMASCRIPT5</closureLanguage>
        <closureAngularPass>true</closureAngularPass>
        <nosuffix>true</nosuffix>
        <webappTargetDir>${project.build.directory}/minify</webappTargetDir>
        <cssSourceIncludes>
            <cssSourceInclude>**/*.css</cssSourceInclude>
        </cssSourceIncludes>
        <cssSourceExcludes>
            <cssSourceExclude>**/*.min.css</cssSourceExclude>
        </cssSourceExcludes>
        <jsSourceIncludes>
            <jsSourceInclude>**/*.js</jsSourceInclude>
        </jsSourceIncludes>
        <jsSourceExcludes>
            <jsSourceExclude>**/*.min.js</jsSourceExclude>
        </jsSourceExcludes>
    </configuration>

</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <webResources>
            <resource>
                <directory>${project.build.directory}/minify</directory>
            </resource>
        </webResources>
    </configuration>
</plugin>

目录结构

我的控制器结构

'use strict';

angular.module('myApp').controller('MyController', function($scope, $filter, $location, $interval, ngTableParams, $modal, $transition, myService, $timeout) {
   ...
});

Chrome 控制台错误

samaxes minify maven plugin 是否支持缩小 angularjs 应用程序,还是我需要使用任何其他替代方案?

请帮助我在我的 angularjs 应用程序中缩小 js 和 css。

【问题讨论】:

  • 使用 maven 构建前端而不是 grunt?我喜欢你的风格,你这个疯子
  • @atmd:我是 angularjs 新手,对 grunt 了解不多。我们一直在使用 maven 为我们的服务器代码创建构建,并且这个应用程序还使用了 java rest 端点,它被封装在 WEB-INF&gt;lib&gt;[jar files] 中。我只经历了this article 直到Why Should I Use Grunt? 部分,我只需要缩小 js 和 css,所以我认为此时我不应该仅仅为了缩小东西而使用 grunt。如果您仍然认为我需要使用 grunt,请纠正我。
  • 不,你走的是可以理解的路线。如果您在后端使用 maven,那么在前端使用它是一个很好的论据。 grunt 的论点通常是使用使用您的软件编写的语言编写的构建工具(即 grunt 脚本是用 js 编写的) Grunt 具有更专注于前端(预编译器、压缩器等)的插件,例如angular focused minifyer。据我所知,你必须把它挂在某个地方的罐子上(比如 YUI 的东西)

标签: javascript angularjs maven yui-compressor


【解决方案1】:

你在正确的轨道上。

请注意,当您缩小控制器的 JavaScript 代码时,它的所有函数参数也会被缩小,并且依赖注入器将无法正确识别服务。

可以通过使用依赖项名称注释函数来解决此问题,以字符串形式提供,不会被缩小。有两种方法:

(1.) 在包含字符串数组的控制器函数上创建一个$inject 属性。例如:

function MyController($scope, $filter, $location, $interval, ngTableParams, $modal, $transition, myService, $timeout) {...}
MyController.$inject = ['$scope', '$filter', '$location', '$interval', 'ngTableParams', '$modal', '$transition', 'myService', '$timeout'];

(2.) 使用内联注释,而不是仅仅提供函数,而是提供一个数组。在您的情况下,它看起来像:

angular.module('myApp').controller('MyController', ['$scope', '$filter', '$location', '$interval', 'ngTableParams', '$modal', '$transition', 'myService', '$timeout', function($scope, $filter, $location, $interval, ngTableParams, $modal, $transition, myService, $timeout) {
   ...
}]);

有关更多信息,请查看此tutorial 的“关于缩小的说明”部分。

【讨论】:

  • ok 所以我尝试了第二种方法并使用了angular.min.js,但我在 chrome 控制台中收到了Error: [$injector:unpr] http://errors.angularjs.org/1.2.27/$injector/unpr?p0=aProvider%20%3C-%20a 错误。将检查您的第一种方法,并将再次返回..
  • 只是为了确定...您在尝试第二种方法之前清除了浏览器的缓存吗?旁注:在声明指令和服务时也应该使用相同的方法。欲了解更多信息,请参阅:errors.angularjs.org/1.2.27/$injector/…
  • 也许这个answer 将帮助您找到导致此问题的代码部分。
  • 谢谢,在服务和指令中还有一些地方需要我进行一些更改。将所有 js 和 css 文件分别合并到 1 个 js 和 css 文件中是否也很好?如果可以,请指点一下。
  • 另外,我如何测试并确定性能提高了多少百分比(或任何单位)?
【解决方案2】:

还要注意 mvn 中的保留字,例如 'then' 和 'catch'。

$http.get('some.json').then(convertResponse).catch(throwError);

可以改写为:

$http.get('some.json')['then'](convertResponse)['catch'](throwError);

希望有人可以提供更好的解决方案,这看起来真的很讨厌。

更多关于Missing name after . operator YUI Compressor for socket.io js files

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多