📜  使用 React.js 和 Node.js 构建在线代码编译器(1)

📅  最后修改于: 2023-12-03 15:06:50.774000             🧑  作者: Mango

使用 React.js 和 Node.js 构建在线代码编译器

编写代码往往需要一个编译器或者 IDE,但是有时候我们只需要快速验证一些简单的代码,或者与其他人共享代码,这时并不需要安装完整的开发环境。这时候,一个在线代码编译器就非常有用了。

本文介绍如何使用 React.js 和 Node.js 来构建一个在线代码编译器。我们将使用 CodeMirror 作为编辑器,并使用 Babel 来编译 JavaScript 代码。我们将使用 Express 来提供后端服务,并使用 Docker 将应用程序部署到云端。

技术栈
  • 前端:React.js、CodeMirror
  • 后端:Node.js、Express、Babel
  • 部署:Docker、AWS
构建前端

我们将使用 React.js 来构建前端。React.js 是一个流行的 JavaScript 框架,它被用于构建大规模的、高性能的 Web 应用程序。CodeMirror 是一个 JavaScript 代码编辑器,它可以轻松地集成到我们的 React 应用程序中。

安装依赖

首先,我们需要安装 React.js 和 CodeMirror:

$ npm install react react-dom codemirror
创建编辑器组件

我们将创建一个名为 Editor 的 React 组件,该组件将包含一个 CodeMirror 实例,用于编辑代码。

import React, { Component } from 'react';
import { Controlled as CodeMirror } from 'react-codemirror2';
import 'codemirror/mode/javascript/javascript';

class Editor extends Component {
  state = {
    code: '',
  };

  handleChange = (editor, data, code) => {
    this.setState({ code });
  };

  render() {
    const { code } = this.state;

    return (
      <CodeMirror
        value={code}
        onBeforeChange={this.handleChange}
        options={{
          mode: 'javascript',
          lineNumbers: true,
        }}
      />
    );
  }
}

export default Editor;
渲染编辑器

我们将在应用程序的根组件中渲染 Editor 组件。

import React from 'react';
import Editor from './Editor';

function App() {
  return (
    <div>
      <Editor />
    </div>
  );
}

export default App;
运行应用程序

运行应用程序:

$ npm start

你应该能够在浏览器中看到编辑器。

构建后端

我们将使用 Node.js 和 Express 来构建后端。Express 是一个流行的 Node.js Web 框架,它使得构建 Web 应用程序变得更加容易。

安装依赖

首先,我们需要安装 Express 和 Babel:

$ npm install express @babel/core @babel/cli @babel/preset-env
配置 Babel

我们需要使用 Babel 将 ES6+ 代码转换为通用的 JavaScript 代码,以便可以在 Node.js 中运行。为此,我们将创建一个 .babelrc 文件,并指定 @babel/preset-env 作为我们要使用的预设。

{
  "presets": ["@babel/preset-env"]
}
创建后端服务

我们将创建一个名为 server.js 的文件,用于创建 Express 应用程序,并提供一个可以编译 JavaScript 代码的路由。

import express from 'express';
import { transformSync } from '@babel/core';

const app = express();
const PORT = process.env.PORT || 8000;

app.use(express.json());

app.post('/compile', (req, res) => {
  const { code } = req.body;

  try {
    const result = transformSync(code, {
      presets: ['@babel/preset-env'],
    });

    res.send(result.code);
  } catch (err) {
    res.status(400).send(err.message);
  }
});

app.listen(PORT, () => {
  console.log(`Server started at http://localhost:${PORT}`);
});
启动后端服务

现在我们可以启动后端服务:

$ node server.js
连接前端和后端

现在我们需要将前端和后端连接起来。我们将使用 AJAX(基于 Fetch API)来向后端发送请求并获取响应。为此,我们将添加一个名为 REACT_APP_API_URL 的环境变量,其中包含我们的 API URL。

添加环境变量

我们将创建一个名为 .env.local 的文件,并添加 REACT_APP_API_URL 环境变量:

REACT_APP_API_URL=http://localhost:8000
发送请求

现在我们将修改 Editor 组件,以便从后端获取编译后的代码。

import React, { Component } from 'react';
import { Controlled as CodeMirror } from 'react-codemirror2';
import 'codemirror/mode/javascript/javascript';

const API_URL = process.env.REACT_APP_API_URL;

class Editor extends Component {
  state = {
    code: '',
    compiledCode: null,
  };

  handleChange = (editor, data, code) => {
    this.setState({ code, compiledCode: null });
  };

  handleSubmit = async () => {
    const { code } = this.state;

    const response = await fetch(`${API_URL}/compile`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ code }),
    });

    const compiledCode = await response.text();

    this.setState({ compiledCode });
  };

  render() {
    const { code, compiledCode } = this.state;

    return (
      <div>
        <div>
          <CodeMirror
            value={code}
            onBeforeChange={this.handleChange}
            options={{
              mode: 'javascript',
              lineNumbers: true,
            }}
          />
        </div>
        <div>
          <button onClick={this.handleSubmit}>Compile</button>
        </div>
        {compiledCode && (
          <div>
            <h2>Compiled code:</h2>
            <pre>
              <code>{compiledCode}</code>
            </pre>
          </div>
        )}
      </div>
    );
  }
}

export default Editor;

现在,当您点击“编译”按钮时,将向后端发送一个 POST 请求,并获取编译后的 JavaScript 代码。

部署应用程序

最后,我们将使用 Docker 和 AWS 将应用程序部署到云端。我们将使用 Amazon Elastic Beanstalk,这是一种完全托管的服务,它可以帮助我们轻松地将 Web 应用程序部署到 AWS。

创建 Dockerfile

我们将创建一个名为 Dockerfile 的文件,用于构建 Docker 镜像。

FROM node:12-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install --production
COPY server.js ./

EXPOSE 8000

CMD ["npm", "start"]
创建 ebextensions 文件夹

我们将创建一个名为 .ebextensions 的文件夹,并添加一个名为 01_run_node_command.config 的文件,它将在应用程序启动时运行一个命令。

commands:
  01_node_dev:
    command: "NODE_ENV=production npm start"
部署应用程序

接下来,我们将使用 eb 命令行工具来创建 Elastic Beanstalk 应用程序和环境。

$ eb init  # 初始化 Elastic Beanstalk
$ eb create  # 创建一个环境
$ eb deploy  # 部署应用程序

现在,我们已成功地将我们的在线代码编译器部署到云端。您可以在 AWS 控制台中查看您的 Elastic Beanstalk 环境,并在其上访问在线代码编辑器。

总结

本文介绍了如何使用 React.js 和 Node.js 构建一个在线代码编译器。我们还介绍了 Babel、Express、Docker 和 AWS 的一些基础知识。希望这篇文章对您有所帮助!