跳转到内容
彼岸论坛
欢迎抵达彼岸 彼岸花开 此处谁在 -彼岸论坛

[程序员] 请教大佬,怎么优雅的配置开发环境


小天管理

已推荐帖子

技术参数

  • 前端:Vanilla JS + TypeScript + Vite
  • 后端:Node.js + TypeScript + Nodemon
  • 前后端都使用 .mts 后缀

项目结构

client/               --- 前端 Vite 项目
    src/main.mts      --- 前端 TS 代码文件
    index.html        --- Vite 入口
    vite.config.mts   --- Vite 配置
    tsconfig.json     --- 前端 TS 配置
    package.json

server/               --- 后端 Node.js Koa 项目
    src/main.mts      --- 后端 TS 代码文件
    tsconfig.json     --- 后端 TS 配置
    package.json

dev.mjs
package.json

希望实现的目标

  • 后端修改 .mts 文件后,自动编译为 .mjs,然后自动重启后端,已知 ts-node 运行 .mts 文件有一堆报错
  • tsc -wnodemonvite 每一个都会阻塞终端,但我希望能实现 npm run dev 一步到位启动前后端开发环境

我目前的方案(期待大大佬给给建议)

  • client/package.json
    {
      "build": "vite build",
      "dev": "vite --host=0.0.0.0",
      "preview": "vite preview"
    }
    
  • server/package.json
    {
      "build": "tsc",
      "build:watch": "tsc -w",
      "dev": "nodemon dist/main.mjs"
    }
    
  • package.json
    {
      "build:client": "npm run build --prefix client",
      "build:server": "npm run build --prefix server",
      "build": "npm run build:client && npm run build:server",
      "dev:client": "npm run dev --prefix client",
      "dev:server": "npm run dev --prefix server",
      "build:watch:server": "npm run build:watch --prefix server",
      "dev": "node dev.mjs"
    }
    

dev.mjs

本来想用 concurrently 并发执行 tsc -wnodemonvite 的,可是 nodemon 执行前必须要确保待执行的 .mjs 文件存在,可是 tsc -w 不一定来得及编译完成,所以我就在 concurrently 加一个一次性的 tsc,可是 concurrently 会执行一次 nodemontsc -w 又会触发一次 nodemon,如果 Koa 在服务运行中时还打印内容的话,终端就会出现重复的一堆打印内容,实在不优雅。

import { spawn } from 'cross-spawn'

const tscWatchProcess = spawn('npm', ['run', 'build:watch:server'])
await new Promise((resolve, reject) => {
    tscWatchProcess.stdout.on('data',
        /** @param {Buffer} chunk */
        chunk => {
            if (chunk.toString().includes('Watching for file changes')) {
                resolve()
            }
        }
    )
    tscWatchProcess.stdout.on('error', reject)
    tscWatchProcess.stderr.on('error', reject)
    tscWatchProcess.stderr.on('data', reject)
})
const viteProcess = spawn('npm', ['run', 'dev:client'])
const modemonProcess = spawn('npm', ['run', 'dev:server'])
/**
 * @param {string} tag
 * @param {Buffer} chunk
 * @param {boolean} isError
 */
const handler = (tag, chunk) => {
    chunk.toString().split('\n').forEach(line => {
        if (line) console.log(`${line}`)
    })
}
viteProcess.stdout.on('data', chunk => handler('client', chunk))
modemonProcess.stdout.on('data', chunk => handler('server', chunk))
viteProcess.stderr.on('data', chunk => handler('client', chunk))
modemonProcess.stderr.on('data', chunk => handler('server', chunk))
意见的链接
分享到其他网站

加入讨论

您现在可以发表并稍后注册. 如果您是会员,请现在登录来参与讨论.

游客
回复主题...

×   粘贴为富文本.   粘贴为纯文本来代替

  只允许使用75个表情符号.

×   您的链接已自动嵌入.   显示为链接来代替

×   您之前的内容已恢复.   清除编辑器

×   您无法直接粘贴图片.要从网址上传或插入图片.

  • 游客注册

    游客注册

  • 会员

  • 最新的状态更新

    没有最新的状态更新
  • 最近查看

    • 没有会员查看此页面.
×
×
  • 创建新的...