捆绑一个NestJS+;打字应用程序(带网页包)

捆绑一个NestJS+;打字应用程序(带网页包),nestjs,typeorm,bundling-and-minification,Nestjs,Typeorm,Bundling And Minification,我最近不得不考虑一种新软件的部署方法,该软件采用以下方式编写: NestJS 6/Express 字体0.2 使用类型脚本 该软件将部署在160多台服务器上,分布在整个欧洲,其中一些服务器的互联网连接非常糟糕 我做了一些研究,并对捆绑进行了大量的。主要的论点是,本机扩展将无法使用像webpack或rollup这样的捆绑包(Spoiler:这是真的,但有一个解决方案)。在我看来,这在很大程度上是因为人们并不关心这一点:《gyp前节点》(node pre gyp)的作者使用了。所以通常,我被告知

我最近不得不考虑一种新软件的部署方法,该软件采用以下方式编写:

  • NestJS 6/Express
  • 字体0.2
  • 使用类型脚本
该软件将部署在160多台服务器上,分布在整个欧洲,其中一些服务器的互联网连接非常糟糕

我做了一些研究,并对捆绑进行了大量的。主要的论点是,本机扩展将无法使用像
webpack
rollup
这样的捆绑包(Spoiler:这是真的,但有一个解决方案)。在我看来,这在很大程度上是因为人们并不关心这一点:《gyp前节点》(node pre gyp)的作者使用了。所以通常,我被告知要么使用
纱线安装
要么

该项目是新的,但
节点\u模块/
文件夹已超过480 MB。使用最大压缩的XZ给了我20 MB的存档。这对我来说还是太大了,而且似乎是对资源的巨大浪费

我还看了以下问答:

  • 说明NestJS支持不带现成的
    节点模块的webpack
  • 工作答案,无需进一步解释。另外,
    IgnorePlugins
    似乎也有些过分
  • 似乎在没有引用的情况下复制/粘贴ZenSoftware的工作解决方案。链接到另一个答案
  • 给出使用NestJS应用程序禁用最小化的建议
TypeForm也有一些单独的Q&A,但它们似乎都需要安装
ts节点
typescript


我设法找到了一个很好的解决方案,通过以下工具可以生成2.7 MB的独立RPM:

  • 具有特殊配置的网页包
  • RPM,使用
    webpack
    ,以分发生成的文件
该软件是一个API服务器,使用PostgreSQL进行持久化。用户通常使用外部服务器进行身份验证,但我们可以使用本地(紧急)用户,因此我们使用
bcrypt
存储和检查密码

我必须坚持:我的解决方案不适用于本机扩展。幸运的是,可以用替换,并且能够使用编译或纯JS

如果想要绑定本机扩展,可以尝试使用。他们设法在一些初步测试中证明了这一点。当然,编译后的扩展应该与您的目标平台相匹配,就像编译后的东西一样

我个人选择了
webpack
,因为NestJS。这仅仅是对
webpack
编译器的传递,但它似乎调整了一些路径,因此比较容易

那么,如何做到这一点呢
webpack
可以将所有内容捆绑在一个文件中,但在本用例中,我需要三个:

  • 主程序
  • TypeORM迁移脚本,因为它们不能与工具捆绑在一起,因为它依赖于文件名
由于每个捆绑需要不同的选项…我使用了3个
webpack
文件。布局如下:

webpack.config.js
webpack
├── migrations.config.js
└── typeorm-cli.config.js
所有这些文件都是基于相同的。主要的区别是我从切换到,因为这更容易阅读,并且非常适合用例

//webpack.config.js
const{NODE_ENV='production'}=process.ENV;
log(`--Webpack build--`);
module.exports={
目标:'节点',
模式:NODE_ENV,
外部:[
//这里列出了NestJS的所有可选依赖项,
//我的项目未安装且不需要的
{
“fastify招摇过市”:“commonjs2 fastify招摇过市”,
“aws sdk”:“commonjs2 aws sdk”,
“@nestjs/websockets/socket模块”:“commonjs2@nestjs/websockets/socket模块”,
“@nestjs/microservices/microservices模块”:“commonjs2@nestjs/microservices/microservices模块”,
//我将跳过生产部署中的pg native,并使用纯JS实现
“pg本机”:“commonjs2 pg本机”
}
],
优化:{
//最小化不适用于@Module注释
错,,
}
};
TypeForm的配置文件更详细,因为我们需要明确使用TypeScript。幸运的是,他们有一些。然而,捆绑迁移工具还需要两个技巧:

  • 忽略文件开头的shebang。轻松解决(5年后仍能正常工作!)
  • 强制
    webpack
    不替换
    require
    调用,用于从JSON或
    env
    文件加载配置。我受到了他的指导,最终建立了自己
//webpack/typeorm-cli.config.js
const path=require('path');
//类型脚本编译选项
const tsconfig-pathsplugin=require('tsconfig-path-webpack-plugin');
//不要尝试替换对动态文件的require调用
const IgnoreDynamicRequire=require('webpack-ignore-dynamic-require');
const{NODE_ENV='production'}=process.ENV;
log(`--TypeORM CLI的Webpack构建--`);
module.exports={
目标:'节点',
模式:NODE_ENV,
条目:'./node_modules/typeorm/cli.js',
输出:{
//请记住,此文件位于子目录中,因此输出应在dist中/
//项目根目录
path:path.resolve(_dirname,../dist'),
文件名:“migration.js”,
},
决心:{
扩展名:['.ts','.js'],
//使用与NestJS相同的配置
插件:[new TsconfigPathsPlugin({configFile:'./tsconfig.build.json'}],
},
模块:{
规则:[
{test:/\.ts$/,loader:'ts loader'},
//跳过typerm/cli.js的shebang
{test:/\[tj]s$/i,loader:'shebang loader'}
],
},
外部:[
{
//我将跳过生产部署中的pg native,并使用纯JS实现
“pg本机”:
%build
mkdir yarncache
export YARN_CACHE_FOLDER=yarncache

# Setting to avoid node-gype trying to download headers
export npm_config_nodedir=/opt/rh/rh-nodejs10/root/usr/

%{_yarnbin} install --offline --non-interactive --frozen-lockfile
%{_yarnbin} bundle

rm -r yarncache/

%install
install -D -m644 dist/main.js $RPM_BUILD_ROOT%{app_path}/main.js

install -D -m644 dist/migration.js $RPM_BUILD_ROOT%{app_path}/migration.js
# Migration path have to be changed, let's hack it.
sed -ie 's/src\/migration\/\*\.ts/migration\/*.js/' ormconfig.json
install -D -m644 ormconfig.json $RPM_BUILD_ROOT%{app_path}/ormconfig.json
find dist/migration -name '*.js' -execdir install -D -m644 "{}" "$RPM_BUILD_ROOT%{app_path}/migration/{}" \;