使用Angular和Webpack的WebAPI模拟服务

作为例子,对于SPA开发(如Vuejs等),通过将WebAPI的响应在Webpack的DevServer中作为模拟服务运行,以提高开发效率是一种常见的方法,但在Angular中(内内存Web API是主流吗?)仅依赖的Webpack无法实现这一点,因此我决定将其作为备忘录整理成文章。

想要设定环境

$ ng --version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/


Angular CLI: 12.1.2
Node: 14.15.4
Package Manager: npm 7.20.0
OS: darwin x64

Angular: 
... 

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.1201.2 (cli-only)
@angular-devkit/core         12.1.2 (cli-only)
@angular-devkit/schematics   12.1.2 (cli-only)
@schematics/angular          12.1.2 (cli-only)

创建项目

使用ng创建。特别是不更改设置,保持默认设置。

$ ng new sample
// デフォルトのままエンター連打
$ tree ./sample
./sample
├── README.md
├── angular.json
├── karma.conf.js
├── node_modules
     // 省略
├── package-lock.json
├── package.json
├── src
│   ├── app
│   ├── assets
│   ├── environments
│   ├── favicon.ico
│   ├── index.html
│   ├── main.ts
│   ├── polyfills.ts
│   ├── styles.css
│   └── test.ts
├── tree.txt
├── tsconfig.app.json
├── tsconfig.json
└── tsconfig.spec.json

添加自定义的webpack配置

由于原始的 Angular 附带的 Webpack 无法实现,因此需要额外引入 custom-webpack 并配置 angular.json。
顺带一提,还需要添加 @types/webpack-dev-server 以便以 TypeScript 编写 DevServer 的设置(在 extra-webpack.config.ts 文件中)。

$ npm i -D @angular-builders/custom-webpack
$ npm i -D @types/webpack-dev-server
       "prefix": "app",
       "architect": {
         "build": {
-          "builder": "@angular-devkit/build-angular:browser",
+          "builder": "@angular-builders/custom-webpack:browser",
           "options": {
+            "customWebpackConfig": {
+              "path": "./extra-webpack.config.ts"
+            },
             "outputPath": "dist/angular",
             "index": "src/index.html",
             "main": "src/main.ts",

           }
         },
         "serve": {
-          "builder": "@angular-devkit/build-angular:dev-server",
+          "builder": "@angular-builders/custom-webpack:dev-server",
           "options": {
             "browserTarget": "angular:build"
           },

创建extra-webpack.config.ts文件

将用作模拟服务的Web API响应记录在extra-webpack.config.ts中。

$ tree ./sample
./sample
├── README.md
├── angular.json
├── extra-webpack.config.ts     ## ここに新規作成
├── karma.conf.js
├── node_modules
├── package-lock.json
├── package.json
├── src
│   ├── app
│   ├── assets
│   ├── environments
│   ├── favicon.ico
│   ├── index.html
│   ├── main.ts
│   ├── polyfills.ts
│   ├── styles.css
│   └── test.ts
├── tree.txt
├── tsconfig.app.json
├── tsconfig.json
└── tsconfig.spec.json
import { Configuration } from 'webpack';
import 'webpack-dev-server';

export default {
    devServer: {
        before: (app, server) => {
            app.get("/api/sample", (req, resp) => {
                // モック内容を定義
                resp.json({
                    resultCode: 0
                });
            });
        }
    }
} as Configuration;

创建客户端代码 (Chuangjian kehuduan daima)

创建一个WebAPU调用的示例代码。

+import { HttpClientModule } from '@angular/common/http';

@NgModule({
  imports: [
    BrowserModule,
+   HttpClientModule,
  ],
})
export class AppModule { }
import { Component } from '@angular/core';
+import { HttpClient, HttpErrorResponse } from '@angular/common/http';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'sample';

+  constructor(private http: HttpClient) {
+    http.get('/api/sample').toPromise()
+      .then(resp => {
+        alert(resp);
+      })
+      .catch((err: HttpErrorResponse) => {
+        console.error(err);
+      })
+  }
}

确认操作

打开应用程序并使用浏览器打开开发者工具,您应该能够确认在通信中正在进行GET请求,地址为/api/sample。

$ ng serve --open
// ブラウザが起動するので開発者ツールを起動してコンソールを確認

整理

我尝试总结了使用Angular和Webpack的devserver的自定义方法,但我觉得这次的内容还是意外地很少有相关信息可以搜索到。
在Angular中,使用官方指南中提到的In-memory Web API可能也能实现我们的目标。
或者可以使用devserver的proxy功能,将请求反向代理到真实的Web API,而不是使用模拟数据。如果选择代理的方式,就不必使用@angular-builders/custom-webpack,只需使用Angular附带的webpack即可,所以可能更加方便一些。

广告
将在 10 秒后关闭
bannerAds