使用node-packer要怎么打包egg应用来启动和部署?
发布于 6 年前 作者 HobaiRiku 8663 次浏览 来自 问答

因为项目可能需要进行保密,让客户无法找到源码,需要打包,看到egg的issue有了解到node-packer。 接着看到官方的例子,是对egg-bin.js 进行nodec,为什么呢?我自己试了egg-script,结果出来的执行文件还是需要app那些文件夹…求助高手。 看到node-packer的issue里面也有相关的https://github.com/pmq20/node-packer/issues/118

30 回复

@atian25 enclose.io 就是 node-packer吧?,没看到有什么其他的,感觉就是打包了node和egg-bin, 如果没有源码文件,运行起来还是没效果。https://github.com/pmq20/node-packer

@zuohuadong 我了解了一下pkg,是可以打包一些普通的“有明确入口的”项目,但是egg这样的框架应用如何进行,有试过或者哪里有demo吗,或者分享一下思路?

@HobaiRiku 没用过,我们一直用的 nest https://github.com/nestjs/nest
操作方式是 tsc 编译成js ,再把入口文件打包 service.js

@zuohuadong 不考虑这个

@HobaiRiku 会打源码的,配置问题?明天有空我试试

昨天花时间测试了一下,自己用原生koa写的项目是可以用pka或者enclose.io来打包的,运行起来没问题,感觉pkg要方便很多速度也更快而且支持assets这些设置,由项目呈递的文档页面静态文件夹也会被直接打包进入可执行文件,enclose.io的node-packer,macbookpro i5的要打包10-20分钟,且目前还没找到如何能够打包静态文件这些。 而eggjs的项目,感觉普通情况下(用egg-bin和egg-script来管理项目启动),用pkg和node-packer打包的东西都只是打包了启动脚本,而这个脚本运行,还是需要根目录有package.json和egg源码文件。 附图(不管是pkg还是node-packer,对egg-bin或者script打包都是一样的结果): Snipaste_2018-10-18_09-17-20.png 或者是egg能有其他方式来编写,自定义一个入口?@atian25

你可以写一个 index.js 来自定义,有 2 个方式:

  • 自己调用 startCluster ,具体看下 egg-scripts 的源码

https://github.com/eggjs/egg-scripts/blob/master/lib/cmd/start.js

  • 或者干脆直接调用 egg-scripts
// index.js
const Command = require('egg-scripts');
new Command([ 'start', '--daemon' ]).start();

@atian25 结合几篇关于egg源码的文章,从scripts看到egg-cluster最后到egg-core,感觉关键的:

const Application = require(options.framework).Application;

以及egg核心framework也就是node_modules里的egg或者某框架,用的是loader之类读取源码文件来加载,而且源码里面有文件是否存在的断言,比如要package.json和node_modules,egg这些。 源码还是稍微有点奇妙的,从egg-core的创建app开始,就包含loader的操作,我也不太清楚打包的工具像pkg和enclose.io是否把项目打包后,对代码中文件操作的影响,所以不管怎么打包(即使可能已经把所有东西都打包了),运行起来,它还是需要package.json,egg这些文件,当我都复制到同一个目录下,可以运行,但是是个空的egg应用。

@HobaiRiku 跟 egg 本身没太大关系的,我记得之前听 enclose 作者分享过,他是把所有文件包括依赖都打包了,然后做了 fs 等的 patch 来映射,所以理论上 Node 应用都可以,egg 没有什么特殊的。

可以直接提 issue 找作者聊聊

我也遇到了这个问题,发现node-packer只打包egg-scripts的依赖文件,没有把app目录下的文件打包进去

看到大家在issue上提问题,作者基本上都没回复

回到问题本身,打包后其实破解也不难

@atian25 @PowerDos 放弃了,做到这一层面的服务还需要这样那样限制,也是很费心很反感…但是所谓的商业化,没办法。

@HobaiRiku 你们一定要私有化部署么?先混淆凑合下吧。。。

@atian25 反正eggjs是不改了,积累了很多基础功能,另外那些需要保密的就用go之类的去弄吧,这样反而也更好开发一些。

@HobaiRiku 没办法,JS 天然在这一块就不好搞

动态载入,在打包后就会有问题。

用过 pkg,可以指定 assets 规则来打包的。速度也很快

@HobaiRiku 可以试试CabloyJS 1、基于EggJS高扩展性和灵活性(感谢EggJS),CabloyJS在EggJS基础上提供了一个“业务模块”的概念 2、每个“业务模块”可以单独编译打包,如果再把"async await"也丑化一下,打包后的文件就真的惨不忍睹了 3、现有的EggJS项目代码可能会稍微调整一下,但整体而言变动不是很大 4、CabloyJS是前后端分离的全栈框架,如果想使用自己的前端风格,直接把CabloyJS当作API服务就可以了

@zhennann ,看了一下文档,看起来是不错的东西啊,好厉害,但是我好像找不到源码,是不开源的吗?想学习一下,因为光看文档好像没那么清晰,不过,这个框个人感觉比较侵入,可能对于我这边的项目类型来说不是很适合,还有ts写法改造会不会麻烦?主要是对“模块”和“编译”这个感兴趣,想问问作者大神是用什么原理或方式,是否分享一下思路?

@HobaiRiku 1、CabloyJS是完全开源的框架,安装之后源码在node-modules中可以看到 2、侵入问题:CabloyJS提供了一整套用户管理角色管理权限管理等系统模块,便于快速的进行业务开发。如果想使用这套模块,可以理解为“比较侵入”。如果想实现自己的业务模式,完全可以忽略这些系统模块。此外,前后端分离的设计,也可以完全忽略系统默认的前端渲染模块。 3、关于ts:从个人观点而言,不建议使用ts。javascript有其固有的简洁和优雅风格。ts经常会破坏这种编程体验。由于CabloyJS基于EggJS,所以,编写测试用例,测试驱动开发,是推荐的企业化开发模式。 4、模块编译原理:EggJS是配置式,比如service文件放置到指定目录,就会被识别自动加载。CabloyJS中的模块是声明式,service文件必须通过代码require,才会被识别加载。因此,CabloyJS中的模块很容易编译,而且也提供了现成的build文件,只需要调配编译的参数(如对哪些语法特性进行babel)即可。 5、CabloyJS中的模块也有一套config、routes、controllers、services、middlewares等等特性。这些代码文件都通过require进行声明,因此都可以编译到一起。CabloyJS在系统初始化时,会自动识别,然后注入到EggJS相应的系统架构中。

@zhennann 了解,有空研究学习一下,但是不用ts肯定不行的,开发不便捷,现在公司的项目除了用于测试的,其余都是ts开发的,egg如果不用ts,很多骚操作的写法就没办法弄了,而且代码提示也是一个,typeorm也不好一起用了。但是你的“require”这个操作,似乎给了一条思路。

@HobaiRiku egg 也有 midwayjs ,借鉴了 nest.js ,都是纯 ts 框架

回到顶部