Swagger 编辑器
SwaggerEditor 使用 forked Create React App 作为其构建基础结构。
入门
先决条件
安装 SwaggerEditor 作为 npm 包和本地开发设置都需要满足这些先决条件。
- node-gyp 与 Python 3.x
- GLIBC
>=2.29
- 需要安装 emscripten 或 docker,我们建议使用 docker 选项
安装
假设 先决条件 已安装,SwaggerEditor npm 包是可安装的,并且适用于 Node.js >= 12.22.0
。您可以通过运行以下命令通过 npm CLI 安装 SwaggerEditor
1 $ npm install swagger-editor@alpha
注意:当使用 bundler 构建使用 swagger-editor@5 npm 包的项目时,您可能会遇到以下 Node.js 错误:
Reached heap limit Allocation failed - JavaScript heap out of memory
。这是由于需要捆绑的代码量很大造成的。可以通过扩展 Node.js 最大堆限制来解决此错误:export NODE_OPTIONS="--max_old_space_size=4096"
。
用法
在您的应用程序中使用该包
1import React from "react";2import ReactDOM from "react-dom";3import SwaggerEditor from "swagger-editor";4import "swagger-editor/swagger-editor.css";5
6const url =7 "https://raw.githubusercontent.com/asyncapi/spec/v2.2.0/examples/streetlights-kafka.yml";8
9const MyApp = () => (10 <div>11 <h1>SwaggerEditor Integration</h1>12 <SwaggerEditor url={url} />13 </div>14);15
16self.MonacoEnvironment = {17 /**18 * We're building into the dist/ folder. When application starts on19 * URL=https://example.com then SwaggerEditor will look for20 * `apidom.worker.js` on https://example.com/dist/apidom.worker.js and21 * `editor.worker` on https://example.com/dist/editor.worker.js.22 */23 baseUrl: `${document.baseURI || location.href}dist/`,24};25
26ReactDOM.render(<MyApp />, document.getElementById("swagger-editor"));
webpack.config.js (webpack@5)
安装 webpack@5 正确构建 SwaggerEditor 所需的依赖项。
1 $ npm i stream-browserify --save-dev2 $ npm i https-browserify --save-dev3 $ npm i stream-http --save-dev4 $ npm i util --save-dev
1const path = require("path");2const webpack = require("webpack");3
4module.exports = {5 mode: "production",6 entry: {7 app: "./index.js",8 "apidom.worker": "swagger-editor/apidom.worker",9 "editor.worker": "swagger-editor/editor.worker",10 },11 output: {12 globalObject: "self",13 filename: "[name].js",14 path: path.resolve(__dirname, "dist"),15 },16 resolve: {17 fallback: {18 path: false,19 fs: false,20 http: require.resolve("stream-http"), // required for asyncapi parser21 https: require.resolve("https-browserify"), // required for asyncapi parser22 stream: require.resolve("stream-browserify"),23 util: require.resolve("util"),24 url: require.resolve("url"),25 zlib: false,26 },27 alias: {28 // This alias make sure we don't pull two different versions of monaco-editor29 "monaco-editor": "/node_modules/monaco-editor",30 // This alias makes sure we're avoiding a runtime error related to this package31 "@stoplight/ordered-object-literal$":32 "/node_modules/@stoplight/ordered-object-literal/src/index.mjs",33 },34 },35 plugins: [36 new webpack.ProvidePlugin({37 Buffer: ["buffer", "Buffer"],38 }),39 ],40 module: {41 rules: [42 {43 test: /\.css$/,44 use: ["style-loader", "css-loader"],45 },46 /**47 * The default way in which webpack loads wasm files won’t work in a worker,48 * so we will have to disable webpack’s default handling of wasm files and49 * then fetch the wasm file by using the file path that we get using file-loader.50 *51 * Resource: https://pspdfkit.com/blog/2020/webassembly-in-a-web-worker/52 *53 * Alternatively, WASM file can be bundled directly into JavaScript bundle as data URLs.54 * This configuration reduces the complexity of WASM file loading55 * but increases the overal bundle size:56 *57 * {58 * test: /\.wasm$/,59 * type: 'asset/inline',60 * }61 */62 {63 test: /\.wasm$/,64 loader: "file-loader",65 type: "javascript/auto", // this disables webpacks default handling of wasm66 },67 ],68 },69};
替代的 webpack.config.js (webpack@5)
我们已经为您构建了 Web Workers 片段,它们位于 npm 发行包的 dist/umd/
目录中。为了避免构建 Web Worker 片段的复杂性,您可以直接使用这些片段。此设置适用于生产和开发 (webpack-dev-server),并将显着缩短您的构建过程。
安装 copy-webpack-plugin
和其他需要的依赖项。
1 $ npm i copy-webpack-plugin --save-dev2 $ npm i stream-browserify --save-dev3 $ npm i https-browserify --save-dev4 $ npm i stream-http --save-dev5 $ npm i util --save-dev
1const path = require("path");2const webpack = require("webpack");3const CopyWebpackPlugin = require("copy-webpack-plugin");4
5module.exports = {6 mode: "production",7 entry: {8 app: "./index.js",9 },10 output: {11 globalObject: "self",12 filename: "static/js/[name].js",13 path: path.resolve(__dirname, "dist"),14 },15 resolve: {16 fallback: {17 path: false,18 fs: false,19 http: require.resolve("stream-http"), // required for asyncapi parser20 https: require.resolve("https-browserify"), // required for asyncapi parser21 stream: require.resolve("stream-browserify"),22 util: require.resolve("util"),23 url: require.resolve("url"),24 zlib: false,25 },26 alias: {27 // This alias make sure we don't pull two different versions of monaco-editor28 "monaco-editor": "/node_modules/monaco-editor",29 // This alias makes sure we're avoiding a runtime error related to this package30 "@stoplight/ordered-object-literal$":31 "/node_modules/@stoplight/ordered-object-literal/src/index.mjs",32 },33 },34 plugins: [35 new webpack.ProvidePlugin({36 Buffer: ["buffer", "Buffer"],37 }),38 new CopyWebpackPlugin({39 patterns: [40 {41 from: "node_modules/swagger-editor/dist/umd/apidom.worker.js",42 to: "static/js",43 },44 {45 from: "node_modules/swagger-editor/dist/umd/editor.worker.js",46 to: "static/js",47 },48 ],49 }),50 ],51 module: {52 rules: [53 {54 test: /\.css$/,55 use: ["style-loader", "css-loader"],56 },57 ],58 },59};
开发
先决条件
假设 先决条件 已安装,Node.js >=20.3.0
和 npm >=9.6.7
是此 repo 运行所需的最低版本,但我们建议使用最新版本的 Node.js@20。
设置
如果您使用 nvm,在此存储库中运行以下命令将自动为您选择正确的 Node.js 版本
1 $ nvm use
运行以下命令以设置存储库以进行本地开发
1 $ git clone https://github.com/swagger-api/swagger-editor.git2 $ cd swagger-editor3 $ git checkout next4 $ git submodule init5 $ git submodule update6 $ npm i7 $ npm start
npm 脚本
Lint
1 $ npm run lint
运行单元和集成测试
1 $ npm test
运行 E2E Cypress 测试
在开发环境中使用
1 $ npm run cy:dev
在持续集成 (CI) 环境中使用
1 $ npm run cy:ci
构建
1 $ npm run build
此脚本将构建所有 SwaggerEditor 构建产物 - app
、esm
和 umd
。
构建产物
构建产物后,将创建两个新目录:build/
和 dist/
。
build/
1$ npm run build:app2$ npm run build:app:serve
构建并提供独立的 SwaggerEditor 应用程序及其所有资产,地址为 https://127.0.0.1:3050/
。
dist/esm/
1$ npm run build:bundle:esm
此捆绑包适合希望在其自己的应用程序中将 SwaggerEditor 用作库并拥有自己的构建过程的第三方使用。
dist/umd/
1$ npm run build:bundle:umd
SwaggerEditor UMD 捆绑包在全局对象上导出 SwaggerEditor 符号。它与定义为外部的 React 捆绑在一起。这允许使用者使用他自己的 React + ReactDOM 版本并延迟挂载 SwaggerEditor。
1<!DOCTYPE html>2<html lang="en">3 <head>4 <meta charset="utf-8" />5 <meta name="viewport" content="width=device-width, initial-scale=1" />6 <meta name="description" content="SwaggerEditor" />7 <title>SwaggerEditor</title>8 <link rel="stylesheet" href="./swagger-editor.css" />9 </head>10 <body>11 <div id="swagger-editor"></div>12 <script13 src="https://unpkg.com/react@18/umd/react.production.min.js"14 crossorigin15 ></script>16 <script17 src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"18 crossorigin19 ></script>20 <script src="./dist/umd/swagger-editor.js"></script>21 <script>22 const props = {23 url: "https://raw.githubusercontent.com/asyncapi/spec/v2.2.0/examples/streetlights-kafka.yml",24 };25 const element = React.createElement(SwaggerEditor, props);26 const domContainer = document.querySelector("#swagger-editor");27
28 ReactDOM.render(element, domContainer);29 </script>30 </body>31</html>
npm
SwaggerEditor 在 npmjs.com 上以 swagger-editor@5
npm 包的形式发布。也可以通过运行以下命令手动生成包(假设您已经按照 设置 步骤操作)
1 $ npm run build:bundle:esm2 $ npm run build:bundle:umd3 $ npm pack
包映射
SwaggerEditor 以以下方式在 package.json
文件中映射其构建产物
1"unpkg": "./dist/umd/swagger-editor.js",2"module": "./dist/esm/swagger-editor.js",3"browser": "./dist/esm/swagger-editor.js",4"jsnext:main": "./dist/esm/swagger-editor.js",5"exports": {6 "./package.json": "./package.json",7 "./swagger-editor.css": "./dist/swagger-editor.css",8 ".": {9 "browser": "./dist/esm/swagger-editor.js"10 },11 "./plugins/*": {12 "browser": "./dist/esm/plugins/*/index.js"13 },14 "./presets/*": {15 "browser": "./dist/esm/presets/*/index.js"16 },17 "./apidom.worker": {18 "browser": "./dist/esm/apidom.worker.js"19 },20 "./editor.worker": {21 "browser": "./dist/esm/editor.worker.js"22 }23}
要了解有关这些字段的更多信息,请参阅 webpack mainFields 文档或 Node.js 模块:包文档。
文档
使用旧版本的 React
[!IMPORTANT] 旧版本我们特指
React >=17 <18
。
默认情况下,swagger-editor@5 npm 包带有最新版本的 React@18。可以使用旧版本的 React 使用 swagger-editor@5 npm 包。
假设我的应用程序与 swagger-editor@5 npm 包集成并使用 [email protected]。
npm
为了通知 swagger-editor@5
npm 包我需要它使用我的 React 版本,我需要使用 npm overrides。
1{2 "dependencies": {3 "react": "=17.0.2",4 "react-dom": "=17.0.2"5 },6 "overrides": {7 "swagger-editor": {8 "react": "$react",9 "react": "$react-dom",10 "react-redux": "^8"11 }12 }13}
[!NOTE] React 和 ReactDOM 覆盖被定义为对依赖项的引用。由于 react-redux@9 仅支持
React >= 18
,因此我们需要使用 react-redux@8。
yarn
为了通知 swagger-editor@5
npm 包我需要它使用我的特定 React 版本,我需要使用 yarn resolutions。
1{2 "dependencies": {3 "react": "17.0.2",4 "react-dom": "17.0.2"5 },6 "resolutions": {7 "swagger-editor/react": "17.0.2",8 "swagger-editor/react-dom": "17.0.2",9 "swagger-editor/react-redux": "^8"10 }11}
[!NOTE] React 和 ReactDOM 解析不能定义为对依赖项的引用。不幸的是,yarn 不支持像 npm 那样使用
$react
或$react-dom
别名。您需要指定确切的版本。
自定义
环境变量
可以使用环境变量来指定本地 JSON/YAML 文件或远程 URL,以便 SwaggerEditor 在启动时加载。这些环境变量将在构建时烘焙到构建产物中。
当前可用的环境变量
变量名 | 描述 |
---|---|
REACT_APP_DEFINITION_FILE | 指定本地文件路径,指定的文件还必须存在于 /public/static 目录中 |
REACT_APP_DEFINITION_URL | 指定远程 URL。此环境变量当前优先于 REACT_APP_SWAGGER_FILE |
REACT_APP_VERSION | 指定此应用程序的版本。版本是从 package.json 文件读取的。 |
示例环境变量值可以在 .env
文件中找到。有关使用环境变量的更多信息,请参阅 Create React App 文档的 添加自定义环境变量 部分。
在 SwaggerUI 中使用预览插件
SwaggerEditor 自带一些 preview
插件,这些插件负责渲染在编辑器中创建的定义。这些插件包括
- EditorPreviewAsyncAPIPlugin - AsyncAPI 规范渲染支持
- EditorPreviewAPIDesignSystemsPlugin - API 设计系统渲染支持
稍作调整,我们可以将这些插件与 SwaggerUI 结合使用,从而提供使用 SwaggerUI 渲染 AsyncAPI 或 API 设计系统定义的能力。
1import SwaggerUI from "swagger-ui";2import SwaggerUIStandalonePreset from "swagger-ui/dist/swagger-ui-standalone-preset";3import "swagger-editor/swagger-editor.css";4import EditorContentTypePlugin from "swagger-editor/plugins/editor-content-type";5import EditorPreviewAsyncAPIPlugin from "swagger-editor/plugins/editor-preview-asyncapi";6import EditorPreviewAPIDesignSystemsPlugin from "swagger-editor/plugins/editor-preview-api-design-systems";7import SwaggerUIAdapterPlugin from "swagger-editor/plugins/swagger-ui-adapter";8
9SwaggerUI({10 url: "https://petstore.swagger.io/v2/swagger.json",11 dom_id: "#swagger-ui",12 presets: [SwaggerUI.presets.apis, SwaggerUIStandalonePreset],13 plugins: [14 EditorContentTypePlugin,15 EditorPreviewAsyncAPIPlugin,16 EditorPreviewAPIDesignSystemsPlugin,17 SwaggerUIAdapterPlugin,18 SwaggerUI.plugins.DownloadUrl,19 ],20});
这里的关键是 SwaggerUIAdapter
插件,它使 SwaggerEditor 插件可以直接与 SwaggerUI 一起使用。
独立模式
SwaggerUI 也支持独立模式。在独立模式下,您将获得一个 TopBar
,其中包含一个输入框,您可以在其中提供定义的 URL,然后 SwaggerUI 会加载该定义。
1import SwaggerUI from "swagger-ui";2import SwaggerUIStandalonePreset from "swagger-ui/dist/swagger-ui-standalone-preset";3import "swagger-ui/dist/swagger-ui.css";4import "swagger-editor/swagger-editor.css";5import EditorContentTypePlugin from "swagger-editor/plugins/editor-content-type";6import EditorPreviewAsyncAPIPlugin from "swagger-editor/plugins/editor-preview-asyncapi";7import EditorPreviewAPIDesignSystemsPlugin from "swagger-editor/plugins/editor-preview-api-design-systems";8import SwaggerUIAdapterPlugin from "swagger-editor/plugins/swagger-ui-adapter";9
10SwaggerUI({11 url: "https://petstore.swagger.io/v2/swagger.json",12 dom_id: "#swagger-ui",13 presets: [SwaggerUI.presets.apis, SwaggerUIStandalonePreset],14 plugins: [15 EditorContentTypePlugin,16 EditorPreviewAsyncAPIPlugin,17 EditorPreviewAPIDesignSystemsPlugin,18 SwaggerUIAdapterPlugin,19 SwaggerUI.plugins.DownloadUrl,20 ],21 layout: "StandaloneLayout",22});
通过 unpkg.com 利用预览插件
可以通过 unpkg.com 以无需构建的方式利用预览插件,从而创建支持多种规范的 SwaggerUI 独立版本。
1<!DOCTYPE html>2<html>3 <head>4 <meta charset="utf-8" />5 <meta name="viewport" content="width=device-width, initial-scale=1" />6 <meta name="theme-color" content="#000000" />7 <meta name="description" content="SwaggerUIMultifold" />8 <link9 rel="stylesheet"1011 />12 </head>13 <body style="margin:0; padding:0;">14 <section id="swagger-ui"></section>15
161718 <script>19 ui = SwaggerUIBundle({});20 // expose SwaggerUI React globally for SwaggerEditor to use21 window.React = ui.React;22 </script>2324 <script>25 SwaggerUIBundle({26 url: "https://petstore3.swagger.io/api/v3/openapi.json",27 dom_id: "#swagger-ui",28 presets: [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset],29 plugins: [30 SwaggerEditor.plugins.EditorContentType,31 SwaggerEditor.plugins.EditorPreviewAsyncAPI,32 SwaggerEditor.plugins.EditorPreviewApiDesignSystems,33 SwaggerEditor.plugins.SwaggerUIAdapter,34 SwaggerUIBundle.plugins.DownloadUrl,35 ],36 layout: "StandaloneLayout",37 });38 </script>39 </body>40</html>
组合自定义的 SwaggerEditor 版本
SwaggerEditor 只是与 swagger-ui-react 一起使用的一些 SwaggerUI 插件。可以通过将单个插件与 swagger-ui 和 swagger-ui-react 组合来创建自定义的 SwaggerEditor。
插件
可用插件列表
- dialogs
- dropdown-menu
- dropzone
- editor-content-fixtures
- editor-content-origin
- editor-content-persistence
- editor-content-read-only
- editor-content-type
- editor-monaco
- editor-monaco-language-apidom
- editor-preview
- editor-preview-api-design-systems
- editor-preview-asyncapi
- editor-preview-swagger-ui
- editor-safe-render
- editor-textarea
- layout
- modals
- splash-screen
- swagger-ui-adapter
- top-bar
- versions
可以通过以下方式导入单个插件
1import EditorContentTypePlugin from "swagger-editor/plugins/editor-content-type";2import EditorContentReadOnlyPlugin from "swagger-editor/plugins/editor-content-read-only";
预设
除了插件之外,还可以使用预设。预设是旨在协同工作以提供复合功能的一组插件。
可用预设列表
- textarea
- monaco
可以通过以下方式导入单个预设
1import TextareaPreset from "swagger-editor/presets/textarea";2import MonacoPreset from "swagger-editor/presets/monaco";
注意:请参考 SwaggerUI 的 插件点文档,以了解预设如何传递给 SwaggerUI。
与 swagger-ui 组合
1import SwaggerUI from "swagger-ui";2import "swagger-ui/dist/swagger-ui.css";3import ModalsPlugin from "swagger-editor/plugins/modals";4import DialogsPlugin from "swagger-editor/plugins/dialogs";5import DropdownMenuPlugin from "swagger-editor/plugins/dropdown-menu";6import DropzonePlugin from "swagger-editor/plugins/dropzone";7import VersionsPlugin from "swagger-editor/plugins/versions";8import EditorTextareaPlugin from "swagger-editor/plugins/editor-textarea";9import EditorMonacoPlugin from "swagger-editor/plugins/editor-monaco";10import EditorMonacoLanguageApiDOMPlugin from "swagger-editor/plugins/editor-monaco-language-apidom";11import EditorContentReadOnlyPlugin from "swagger-editor/plugins/editor-content-read-only";12import EditorContentOriginPlugin from "swagger-editor/plugins/editor-content-origin";13import EditorContentTypePlugin from "swagger-editor/plugins/editor-content-type";14import EditorContentPersistencePlugin from "swagger-editor/plugins/editor-content-persistence";15import EditorContentFixturesPlugin from "swagger-editor/plugins/editor-content-fixtures";16import EditorPreviewPlugin from "swagger-editor/plugins/editor-preview";17import EditorPreviewSwaggerUIPlugin from "swagger-editor/plugins/editor-preview-swagger-ui";18import EditorPreviewAsyncAPIPlugin from "swagger-editor/plugins/editor-preview-asyncapi";19import EditorPreviewApiDesignSystemsPlugin from "swagger-editor/plugins/editor-preview-api-design-systems";20import TopBarPlugin from "swagger-editor/plugins/top-bar";21import SplashScreenPlugin from "swagger-editor/plugins/splash-screen";22import LayoutPlugin from "swagger-editor/plugins/layout";23import EditorSafeRenderPlugin from "swagger-editor/plugins/editor-safe-render";24
25SwaggerUI({26 url: "https://petstore.swagger.io/v2/swagger.json",27 dom_id: "#swagger-editor",28 plugins: [29 ModalsPlugin,30 DialogsPlugin,31 DropdownMenuPlugin,32 DropzonePlugin,33 VersionsPlugin,34 EditorTextareaPlugin,35 EditorMonacoPlugin,36 EditorMonacoLanguageApiDOMPlugin,37 EditorContentReadOnlyPlugin,38 EditorContentOriginPlugin,39 EditorContentTypePlugin,40 EditorContentPersistencePlugin,41 EditorContentFixturesPlugin,42 EditorPreviewPlugin,43 EditorPreviewSwaggerUIPlugin,44 EditorPreviewAsyncAPIPlugin,45 EditorPreviewApiDesignSystemsPlugin,46 TopBarPlugin,47 SplashScreenPlugin,48 LayoutPlugin,49 EditorSafeRenderPlugin,50 ],51 layout: "StandaloneLayout",52});
与 swagger-ui-react 组合
1import React from "react";2import ReactDOM from "react-dom";3import SwaggerUI from "swagger-ui-react";4import "swagger-ui-react/swagger-ui.css";5import ModalsPlugin from "swagger-editor/plugins/modals";6import DialogsPlugin from "swagger-editor/plugins/dialogs";7import DropdownMenuPlugin from "swagger-editor/plugins/dropdown-menu";8import DropzonePlugin from "swagger-editor/plugins/dropzone";9import VersionsPlugin from "swagger-editor/plugins/versions";10import EditorTextareaPlugin from "swagger-editor/plugins/editor-textarea";11import EditorMonacoPlugin from "swagger-editor/plugins/editor-monaco";12import EditorMonacoLanguageApiDOMPlugin from "swagger-editor/plugins/editor-monaco-language-apidom";13import EditorContentReadOnlyPlugin from "swagger-editor/plugins/editor-content-read-only";14import EditorContentOriginPlugin from "swagger-editor/plugins/editor-content-origin";15import EditorContentTypePlugin from "swagger-editor/plugins/editor-content-type";16import EditorContentPersistencePlugin from "swagger-editor/plugins/editor-content-persistence";17import EditorContentFixturesPlugin from "swagger-editor/plugins/editor-content-fixtures";18import EditorPreviewPlugin from "swagger-editor/plugins/editor-preview";19import EditorPreviewSwaggerUIPlugin from "swagger-editor/plugins/editor-preview-swagger-ui";20import EditorPreviewAsyncAPIPlugin from "swagger-editor/plugins/editor-preview-asyncapi";21import EditorPreviewApiDesignSystemsPlugin from "swagger-editor/plugins/editor-preview-api-design-systems";22import TopBarPlugin from "swagger-editor/plugins/top-bar";23import SplashScreenPlugin from "swagger-editor/plugins/splash-screen";24import LayoutPlugin from "swagger-editor/plugins/layout";25import EditorSafeRenderPlugin from "swagger-editor/plugins/editor-safe-render";26
27const SwaggerEditor = () => {28 return (29 <SwaggerUI30 url={url}31 plugins={[32 ModalsPlugin,33 DialogsPlugin,34 DropdownMenuPlugin,35 DropzonePlugin,36 VersionsPlugin,37 EditorTextareaPlugin,38 EditorMonacoPlugin,39 EditorMonacoLanguageApiDOMPlugin,40 EditorContentReadOnlyPlugin,41 EditorContentOriginPlugin,42 EditorContentTypePlugin,43 EditorContentPersistencePlugin,44 EditorContentFixturesPlugin,45 EditorPreviewPlugin,46 EditorPreviewSwaggerUIPlugin,47 EditorPreviewAsyncAPIPlugin,48 EditorPreviewApiDesignSystemsPlugin,49 TopBarPlugin,50 SplashScreenPlugin,51 LayoutPlugin,52 EditorSafeRenderPlugin,53 ]}54 layout="StandaloneLayout"55 />56 );57};58
59ReactDOM.render(<SwaggerEditor />, document.getElementById("swagger-editor"));
Docker
预构建的 DockerHub 镜像
SwaggerEditor 可作为托管在 DockerHub 上的预构建 Docker 镜像使用。
1$ docker pull swaggerapi/swagger-editor:next-v52$ docker run -d -p 8080:80 swaggerapi/swagger-editor:next-v5
本地构建
特权镜像:
1 $ npm run build:app2 $ docker build . -t swaggerapi/swagger-editor:next-v53 $ docker run -d -p 8080:80 swaggerapi/swagger-editor:next-v5
现在,在您的浏览器中打开 https://127.0.0.1:8080/
。
非特权镜像:
1 $ npm run build:app2 $ docker build . -f Dockerfile.unprivileged -t swaggerapi/swagger-editor:next-v5-unprivileged3 $ docker run -d -p 8080:8080 swaggerapi/swagger-editor:next-v5-unprivileged
现在,在您的浏览器中打开 https://127.0.0.1:8080/
。
SwaggerEditor 当前不支持自定义环境变量。
许可证
SwaggerEditor 基于 Apache 2.0 许可证 授权。SwaggerEditor 附带一个明确的 NOTICE 文件,其中包含其他法律声明和信息。
此项目使用 REUSE 规范,该规范定义了一种用于声明软件项目版权和许可的标准化方法。