交互式编译项目

博客介绍了前端项目可视化编译的操作流程。先通过键盘选择编译项目,再选运营环境,编译完成后项目在本地调试启动成功。还提到执行命令可唤起可视化编译界面,其整体逻辑为修改、打包、上传代码,涉及3个库,并对各库作用进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、操作流程

# 编译模式 mode
# start 本地调试
# publish 发布代码

# 启动脚本 file
# dev.js 本地调试
# build.js 发布代码

执行npm run [mode]回车后,通过键盘上下按键选择要编译的具体项目,如下所示:

58b01c6523884d3390c349fcdec0a48d.png

选择完项目后直接回车,会出现选择运营的环境,选完回车即可

236b05a107724b71a9b1a86b37a2e662.png

编译完成后,界面会显示项目运行中,就是项目在本地调试已启动成功

57bad8c7d51b4159beeefc66f45f6237.png

二、npm run start|publish

执行命令npm run [mode]即可唤起可视化编译界面,实际就是执行script目录下的js文件,如下所示:

{
  "name": "uniapp",
  "scripts": {
    "start": "node ./script/dev.js", // 本地调试
    "publish": "node ./script/build.js" // 发布代码
	}
}

三、可视化执行代码

整体逻辑就是跟deploy.sh文件的一致,修改manifest.json=>打包代码=>上传代码,这里主要涉及到3个npm库。

3.1、inquirer文档

1f89e6e94d714d808faa172e15bd2c8b.png
0bd6cbf8da0844a180c416919e2ac7d9.png

交互核心就是使用inquirer来展现可供用户操作的选项,返回的内容就是list中选中的value

// 选择运行项目
const { project } = await inquirer.prompt([
  {
    type: 'list',
    message: '请选择您要运行的项目:',
    name: 'project',
    choices: [
      {
        key: '0',
        name: '项目',
        value: 'xx'
      }
    ]
  }
])

// 选择运行环境
const { environment } = await inquirer.prompt([
  {
    type: 'list',
    message: '请选择您要运行的环境:',
    name: 'environment',
    choices: [
      {
        key: '0',
        name: '测试环境',
        value: 'stage'
      },
      {
        key: '1',
        name: '仿真环境',
        value: 'simula'
      },
      {
        key: '2',
        name: '生产环境',
        value: 'prod'
      }
    ]
  }
])

3.2、execa文档

命令执行核心就是使用execa,比如npmscpnode这些都可以通过execa来实现运行。类似用法如下所示:

/**
 * 修改mainifest.json
 * @param environment
 * @param project
 * @param type
 * @returns {Promise<void>}
 */
async function runManifest (environment, project, type) {
  const manifestName = `./key/manifest_${environment}_${project}_${type}.js`
  const execaManifest = () => execa('node', [manifestName], { stdio: 'inherit' })
  await runTask('修改配置', execaManifest)
}

/**
 * 启动项目
 * @param project
 * @returns {Promise<void>}
 */
async function runNpm (environment, project) {
  const npmCli = `${environment}:${npmTypeMap[project]}-${project}`
  const execaNpm = () => execa('npm run', [npmCli], { stdio: 'inherit' })
  await runTask('打包项目', execaNpm)
}

/**
 * 发布微信小程序代码
 * @returns {Promise<void>}
 */
async function uploadWeixin () {
  const execaUpload = () => execa('node', ['./key/upload.js'], { stdio: 'inherit' })
  await runTask('发布代码', execaUpload)
}

/**
 * H5上传代码到服务器
 * @param environment
 * @param project
 * @returns {Promise<void>}
 */
async function uploadH5 (environment, project) {
  const ip = h5Ip[environment]
  const uploadPath = `root@${ip}:/app/poseidon/html/${project}`
  console.log('uploadH5=>uploadPath=>', uploadPath)
  const execaUpload = () => execa('scp', ['-r', './dist/build/h5/*', uploadPath], { stdio: 'inherit' })
  await runTask('上传代码到服务器', execaUpload)
}

3.3、ora文档

43505e78359d4c36af81e5cd183dd699.png

打印信息的作用,调用ora().start()提示某环节已启动,实例调用succeed打印该环节已成功结束,实例调用fail打印该环节执行失败,可参考如下写好的方法:

/**
 * 执行任务
 * @param taskName
 * @param task
 * @returns {Promise<void>}
 */
async function runTask (taskName, task) {
  const s = ora().start(`${taskName} 执行中 `)
  try {
    await task()
    s.succeed(`${taskName} 执行完成!`)
  } catch (e) {
    s.fail(`${taskName} 执行失败!`)
    console.error(`失败原因:${e.toString()}`)
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马甲丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值