如何使用Maven配置使用TypeScript的Angular2应用程序?

47

我是一个Angular2的新手。我的项目技术栈是Angular2和typescript,后端使用spring。我不想使用node服务器编译我的前端,而是希望使用TOMCAT和Maven。我有几个问题。

  1. 我猜测node服务器会为每个.ts文件生成.js和.js.map文件,因为浏览器只能理解.js文件。我的理解正确吗?我如何使用Maven和Tomcat完成这个任务?
  2. 我想使用Maven从头开始构建我的应用程序。我将优先选择bower作为前端任务管理器。

有人可以给我一个逐步指南,以创建一个Angular2 + Spring应用程序,使用“bower或任何其他工具进行前端任务管理,如文件最小化,创建应用框架”,并使用“Maven进行后台任务管理”吗?我对任何建议都持开放态度。


1
TypeScript编译器(tsc)生成.js和map文件,而不是node.js。一旦您拥有js、css、html等文件,您可以像任何其他网站一样提供它们。 - rgvassar
2个回答

34

我在我的Angular 2 + Spring Boot应用程序中使用TypeScript .ts文件,并通过Maven运行npm install来安装依赖项,然后通过exec-maven-plugin 运行npm run tsc将.ts文件转换为.js文件。

下面是我的pom.xml文件中的插件部分。在我的应用程序中,package.json、tsconfig.json和typings.json都位于src/main/resources路径下,因此在该路径下运行npm任务。

pom.xml

<parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>1.3.5.RELEASE</version>
</parent>

<packaging>war</packaging>


<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>exec-npm-install</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}/src/main/resources</workingDirectory>
                        <executable>npm</executable>
                        <arguments>
                            <argument>install</argument>
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
                <execution>
                    <id>exec-npm-run-tsc</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}/src/main/resources</workingDirectory>
                        <executable>npm</executable>
                        <arguments>
                            <argument>run</argument>
                            <argument>tsc</argument>
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

我的Angular2 + Spring Boot应用程序文件夹结构如下:

src/main/resources
                  /app          - .ts and converted .js
                  /css
                  /images
                  /js           - systemjs.config.js is also placed here
                  /node_modules - generated by npm install and will include in war
                  /typings
                  application.properties
                  package.json
                  tsconfig.json
                  typings.json

src/main/webapp
               /WEB-INF
                       /jsp     - all .jsp files
在 .jsp 文件的头部,包含 systemjs.config.js
<script type="text/javascript" src="webjars/zone.js/0.6.12/dist/zone.js"></script>
<script type="text/javascript" src="webjars/reflect-metadata/0.1.3/Reflect.js"></script>
<script type="text/javascript" src="webjars/systemjs/0.19.27/dist/system.js"></script>
<script type="text/javascript" src="js/systemjs.config.js"></script>

以下是我的WebMvcConfigurerAdapter代码,用于映射路径:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.my.controller")
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        if (!registry.hasMappingForPattern("/webjars/**")) {
            registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
        }
        if (!registry.hasMappingForPattern("/images/**")) {
            registry.addResourceHandler("/images/**").addResourceLocations("classpath:/images/");
        }
        if (!registry.hasMappingForPattern("/css/**")) {
            registry.addResourceHandler("/css/**").addResourceLocations("classpath:/css/");
        }
        if (!registry.hasMappingForPattern("/js/**")) {
            registry.addResourceHandler("/js/**").addResourceLocations("classpath:/js/");
        }
        if (!registry.hasMappingForPattern("/app/**")) {
            registry.addResourceHandler("/app/**").addResourceLocations("classpath:/app/");
        }
        if (!registry.hasMappingForPattern("/node_modules/**")) {
            registry.addResourceHandler("/node_modules/**").addResourceLocations("classpath:/node_modules/");
        }
    }

    @Bean
    public InternalResourceViewResolver internalViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setOrder(1);
        return viewResolver;
    }
}

需要提及的一件事是,如果操作系统是 Windows 或 Mac,运行 exec-maven-plugin 在 eclipse 上会遇到一些问题。在 Linux(Ubuntu)上似乎没有任何问题。 在 Windows 或 Mac 上从 eclipse 运行构建时,问题在于它无法理解 npm 命令并尝试查找此类文件,即使 maven 构建在终端或命令窗口上完全正常。

为了解决这个问题,我做了一些调整。 对于 Mac,创建 node 和 npm 的符号链接,放置在 /usr/bin 路径下,如下所示。 但是修改 /usr/bin 是不允许的,所以我在重启后通过恢复磁盘完成了这个过程。

lrwxr-xr-x     1 root   wheel        17 May 22 03:01 node -> ../local/bin/node
lrwxr-xr-x     1 root   wheel        44 May 22 02:50 npm -> ../local/lib/node_modules/npm/bin/npm-cli.js

对于Windows系统,我在系统路径下创建了node.bat和npm.bat文件,如下所示。完成后,从Windows 10的eclipse和命令窗口都可以很好地进行maven构建。

npm.bat

@echo off
set arg1=%1
set arg2=%2
set arg3=%3
set arg4=%4
C:\Progra~1\nodejs\npm.cmd %arg1% %arg2% %arg3% %arg4%

1
但是如果你包含 node_modules,你的 war 包会非常庞大,不是吗? - Mark T
1
是的,war文件会更大。我的Spring Boot应用最初使用了WebJar,它也包含在war文件中并设计为分发。但是你可以为Web服务器设置node_module并反向代理它。 - Steve Park
我知道你可以使用Bower来减小文件大小并只包含所需的内容,但我不确定我是否理解正确。 - Mark T
我之前提到了一种极端的方式。如果在应用服务器上设置了node_module路径作为URL(例如,使用Apache的Location和Alias设置,这样文件路径就可以作为URL使用),那么你的应用程序将使用URL路径来获取.js和.css文件。但是这需要额外的工作流程来更新node_module,因为它不在构建过程之内。 - Steve Park
1
在 exec-maven-plugin 的版本 1.5 中,你应该使用 <executable>npm.cmd</executable> 而不是 <executable>npm</executable>。这样在 Windows 上的 IntelliJ 中就可以正常工作,而无需任何 .bat 文件。 - Daniel Stradowski
显示剩余3条评论

3
typescript文件以.ts结尾,使用typescript编译器而非node.js进行编译。它们是完全分离的,请参阅http://www.typescriptlang.org/ 了解更多关于typescript本身的信息。
要使用Angular2,您不需要使用typescript,您可以编写普通的Javascript。尽管Angular2团队正在使用Typescript创建框架。
因此,回答您的第一个问题,两者都没有涉及。您可以按照自己的方式创建HTML、CSS和Javascript。
至于使用bower,Angular2在官方上并不存在,只有npm上有。您可以在这里https://github.com/angular/angular/issues/4018看到相关讨论。正如在讨论中所说,如果您真的想使用bower,可以使用GitHub端点。

感谢Namirna的建议。我正在寻找一些替代工具来设置我的项目,其中包括Angular2和Spring。由于Bower不适用于Angular2,我想知道是否有其他工具与Maven有良好的集成? - Gendaful
Npm 似乎正在接管世界 :) 我还没有研究它与 Maven 的集成,但我无法相信它不在那里,因为 npm 几乎无处不在,而且在当今 Web 开发中几乎是依赖项的事实标准... 并且进行了非常快速的谷歌搜索,我找到了插件。 - Namirna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接