您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    前端:如何基于Node.JS从零构建线上自动化打包任务流?(2)
    时间:2021-08-13 21:03 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    在下面引见的dooring任务流中,我们知道为了实理想时打包,我们需求一个H5 Template项目,作为打包的母版,当用户点击下载时,会将页面的json schema数据传给node效劳器, node效劳器再将json schema停止数据清洗最后生成template.json文件并移动到H5 Template母版中,此时母版拿到数据源并停止打包编译,最后生成可执行文件。

    以上的进程很关键, 这里笔者画个大致的流程图:

    前端:如何基于Node.JS从零构建线上自动化打包任务流?

    H5-Dooring

    为了完成以上进程,我们需求两个关键环节: 1. 将用户配置的数据停止处置并生成json文件,然后移动到H5 Template母版中 2. 在母版中自动执行打包编译脚本

    第一个环节很好完成,我们只需求用nodejs的fs模块生成文件到指定目录即可,这里笔者重点引见第二个环节的完成。

    当我们将json数据生成到H5 Template中之后,就可以停止打包了,但是这个进程需求自动化地去处置,不能像我们之前启动项目一样,手动执行npm start或许yarn start。我们需求顺序自动帮我们执行这个命令行指令,笔者在查nodejs API突然发现了child_process的exec办法,可以用来解析指令,这个刚好能完成我们的需求,所以我们末尾完成它。代码如下:

    import { exec } from 'child_process' 

    const outWorkDir = resolve(__dirname, '../h5_landing'

    const fid = uuid(8, 16) 

    const cmdStr = `cd ${outWorkDir} && yarn build ${fid}` 

     

    // ...exec相关代码 

    const filePath = resolve(__dirname, '../h5_landing/src/assets/config.json'

    const res = WF(filePath, data) 

     

    exec(cmdStr, function(err,stdout,stderr){ 

      if(err) { 

        // 错误处置 

      } else { 

        // 成功处置 

      } 

    }) 

    以上代码我们不难了解,我们只需求定义好打包的指令字符串(方式和命令行操作简直分歧),然后传入给exec的第一个参数,他就会帮我们解析字符串并执行对应的命令行指令。在执行完成之后,我们可以依据回调函数(第二个参数)里的参数值来判别执行结果。整个进程是异步的,所以我们不用担忧阻塞成绩,为了实时反应进度,我们可以用socket来将进度信息推送到阅读器端。

    4.完成音讯实时推送

    在下面引见的 exec完成解析并执行命令行指令 中还有一些细节可以优化,比如代码执行进程的反应,执行形状的反应。由于我们用的是异步编程,所以央求不会不断等候,假设不采取任何优化措施,用户是不能够知道何时代码打包编译完成, 也不知道代码能否编译失败,所以这个时分会采取几种常用的方案: 客户端央求长轮询 postmessage音讯推送 * websocket双向通讯

    很清楚运用websocket双向通讯会更适宜本项目。这里我们直接运用社区比较火的由于官网上有很多运用引见,这里笔者就不逐一阐明了。我们直接看业务里的代码运用:

    // node端 

    exec(cmdStr, function(err,stdout,stderr){ 

      if(err) { 

        console.log('api error:'+stderr); 

        io.emit('htmlFail', { result: 'error', message: stderr }) 

      } else { 

        io.emit('htmlSuccess', { result: dest, message: stderr }) 

      } 

    }) 

     

    // 阅读器端 

    const socket = io(serverUrl); 

    // ...省略其他业务代码 

    useEffect(() => { 

      socket.on('connect'function(){ 

        console.log('connect'

      }); 

      socket.on('htmlFail'function(data){ 

        // ... 

      }); 

      socket.on('disconnect'function(e){ 

        console.log('disconnect', e) 

      }); 

    }, []) 

    这样我们就能完成效劳器义务流的形状实时反应给阅读器端了。

    5. 运用jszip完成效劳端紧缩文件并支持前端下载zip包 (责任编辑:admin)