Skip to content

JS 代码在线运行工具

提示

一个工具:在线运行 JS 代码,查看打印结果。

jsx
import React, { useState } from 'react'
import { Input, Button } from 'antd'
import * as ts from 'typescript' // 引入 TypeScript 模块
import './index.scss'

const { TextArea } = Input

const CodeRunner = () => {
  const [code, setCode] = useState('')
  const [output, setOutput] = useState('')

  const transpileToJavaScript = (tsCode) => {
    const compilerOptions = {
      target: ts.ScriptTarget.ES5,
      module: ts.ModuleKind.CommonJS,
      jsx: ts.JsxEmit.React,
      noEmitOnError: true,
      strict: true, // 启用所有严格类型检查选项
      noImplicitAny: true, // 报告隐含的 any 类型
      strictNullChecks: true // 检查 null 和 undefined
    }

    // 将 TypeScript 代码转为 JavaScript 代码
    //  transpileModule 只处理文本并且不会进行类型检查
    const result = ts.transpileModule(tsCode, {
      compilerOptions,
      reportDiagnostics: true // 启用诊断信息
    })

    return {
      jsCode: result.outputText
    }
  }

  const runCode = () => {
    try {
      // 使用 TypeScript 编译器 API 将 TypeScript 代码转为 JavaScript 代码并获取诊断信息
      const { jsCode, diagnostics } = transpileToJavaScript(code)

      // 检查诊断信息
      if (diagnostics && diagnostics.length > 0) {
        // 处理错误信息
        const errorMessage = diagnostics.map((diagnostic) =>
          ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n')
        )
        setOutput('TypeScript Error:\n' + errorMessage.join('\n'))
        return
      }

      // 使用 new Function 创建用户输入的代码的函数
      const userFunction = new Function(jsCode)

      // 捕获 console.log 输出,并显示在页面上
      let consoleOutput = ''
      const originalConsoleLog = console.log
      console.log = function () {
        // 将 console.log 的输出记录到 consoleOutput 变量中
        consoleOutput += Array.from(arguments).join(' ') + '\n'
        // 然后调用原始的 console.log
        originalConsoleLog.apply(console, arguments)
      }

      // 执行用户输入的代码
      userFunction()

      // 将 console.log 的输出显示在页面上
      setOutput(consoleOutput)

      // 恢复 console.log,确保不影响其他部分的代码
      console.log = originalConsoleLog
    } catch (error) {
      // 如果在执行过程中发生错误,将错误信息显示在页面上
      setOutput('Error:\n' + error.message)
    }
  }

  return (
    <div className="main-box">
      <div className="mb20">
        <label htmlFor="jsCode" className="f20">
          1. 请输入JS/TS代码:
        </label>
        <p className="tips">备注:TS代码不会进行类型检查</p>
      </div>
      <div className="mb20">
        <TextArea
          id="jsCode"
          rows="20"
          cols="50"
          value={code}
          onChange={(e) => setCode(e.target.value)}></TextArea>
      </div>
      <div className="mb20">
        <Button type="primary" onClick={runCode}>
          2. 运行JS/TS代码(查看打印结果)
        </Button>
      </div>

      <div id="output">
        <p className="f20">打印结果如下:</p>
        {output}
      </div>
    </div>
  )
}

export default CodeRunner