使用 Spring Boot 应用程序进行客户端开发 - 第 2 部分
纯 JavaScript 与 SSE 流
在这个简单的 HTML 替换用例中,Vue 并没有真正增加太多价值,而且它根本不会为 SSE 示例增加任何价值,因此我们将直接使用原生 JavaScript 实现它。这是一个流选项卡
<div class="tab-pane fade" id="stream" role="tabpanel">
<div class="container">
<div id="load"></div>
</div>
</div>
以及一些用于填充它的 JavaScript 代码
<script type="module">
var events = new EventSource("/stream");
events.onmessage = e => {
document.getElementById("load").innerHTML = e.data;
}
</script>
使用 React 的动态内容
大多数使用 React 的人可能不仅仅做一些逻辑处理,最终会在 JavaScript 中完成所有布局和渲染工作。您不必这样做,而且只需使用少量 React 即可轻松上手。您可以就此止步,将其用作实用程序库,也可以发展为完整的 JavaScript 客户端组件方法。
我们可以在不做太大改动的情况下开始尝试一下。如果您想查看,示例代码最终看起来会像 `react-webjars` 示例。首先是 `pom.xml` 中的依赖项
<dependency>
<groupId>org.webjars.npm</groupId>
<artifactId>react</artifactId>
<version>17.0.2</version>
</dependency>
<dependency>
<groupId>org.webjars.npm</groupId>
<artifactId>react-dom</artifactId>
<version>17.0.2</version>
</dependency>
以及 `index.html` 中的模块映射
<script type="importmap">
{
"imports": {
...
"react": "/npm/react/umd/react.development.js",
"react-dom": "/npm/react-dom/umd/react-dom.development.js"
}
}
</script>
React 尚未打包为 ESM 包(无论如何),因此没有“模块”元数据,我们必须像这样硬编码资源路径。“umd”在资源路径中指的是“通用模块定义”,这是对模块化 JavaScript 的较旧尝试。它足够接近,如果您眯着眼睛看,可以用类似的方式使用它。
有了这些,您可以导入它们定义的函数和对象
<script type="module">
import * as React from 'react';
import * as ReactDOM from 'react-dom';
</script>
因为它们并不是真正的 ESM 模块,所以您可以在 HTML `` 的全局级别执行此操作,例如,我们在其中导入 `bootstrap` 的位置。然后,您可以通过创建 `React.Component` 来定义一些内容。这是一个非常基本的静态示例
<script type="module">
const e = React.createElement;
class RootComponent extends React.Component {
constructor(props) {
super(props);
}
render() {
return e(
'h1',
{},
'Hello, world!'
);
}
}
ReactDOM.render(e(RootComponent), document.querySelector('#root'));
</script>
`render()` 方法返回一个函数,该函数创建一个新的 DOM 元素(带有内容“Hello, world!”的 `
`)。它由 `ReactDOM` 附加到具有 `id="root"` 的元素,因此我们最好也添加一个,例如在“测试”选项卡中
<div class="tab-pane fade" id="test" role="tabpanel">
<div class="container" id="root"></div>
</div>
<div class="tab-pane fade" id="test" role="tabpanel">
<div class="container" id="root"></div>
</div>
如果您运行它,它应该工作,并且应该在该选项卡中显示“Hello World”。
JavaScript 中的 HTML:XJS
大多数 React 应用程序使用通过名为“XJS”的模板语言嵌入到 JavaScript 中的 HTML(可以用其他方式使用,但实际上现在是 React 的一部分)。上面的 hello world 示例如下所示
<script type="text/babel">
class Hello extends React.Component {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}
ReactDOM.render(
<Hello name="World"/>,
document.getElementById('root')
);
</script>
组件定义了一个自定义元素 `