在客户端部署没有npm的node.js项目

chr*_*lly 5 javascript node.js npm gruntjs

我想部署一个频繁更新的nodejs项目.npm在站点上不可用,所以我必须打包node_modules.这可以正常工作,但需要很长时间才能通过可用的ftp连接发送给客户(每次80MB,主要是node_module文件).我的工作流程如下:

git clone project
npm install   # installs all my dev tools which I need for packaging
grunt build 
tar xvzf build.tar.gz build/
Run Code Online (Sandbox Code Playgroud)

构建步骤仅将我的代码打包缩小到需要的范围.node_modules文件夹将复制到构建文件夹中.如果我使用npm install --production,我会占用更小的空间,但却错过了我首先需要的工具.所以最后我努力使我的代码占用空间很小,但是我必须打包这么大的node_modules树来解决我的所有工作.

我的方法有误吗?是否有一种更简单的方法来部署生产服务器上没有npm的地方,或者是否有一种减小node_modules文件夹大小的好方法?

chr*_*lly 6

更新:自写这个答案以来,npm3(和yarn)到了,并且扁平化了npm依赖项.这大大减小了node_modules文件夹的大小 (对于典型的项目,可能是20% - 30%).尽管如此,下面的一些提示可以将您的足迹减少一个数量级.

我已经为任何想要的人编制了调查结果列表

  1. 在服务器上没有npm部署
  2. 减少node_modules文件夹的占用空间

较小的node_modules占用空间:

  • 使用npm prune --production删除devDependencies并清除其他模块

    在我的情况下,这个node_modules文件夹大小约20%.

    文件node_modules夹下的大量文件仅限于少量在运行时未使用模块!.清除/删除这些可将占地面积减少10倍!例如:业力,凉亭,少和咕噜声.其中许多都是模块本身使用的,并且在生产构建中没有位置.缺点是必须在每次构建之前运行npm install.

  • 使用部分npm包

    许多npm包都有部分可用.例如,安装所有asynclodash仅安装您需要的位:例如

Bad: npm install -save lodash async

Good: npm install --save async.waterfall async.parallel lodash.foreach

通常,单个lodash模块的大小是整个包装的1/100.

  • npm-package-minifier可用于减小node_modules树的大小

    压缩node_modules以进行客户端部署

    这基本上删除了node_modules树中的许多未使用的文件.此工具还将减少devDependencies的大小,因此它应该在node_modules的"生产"版本上运行.

减少更新的大小

  • 差异部署

    如评论中所述,更新可能会拆分为需要依赖项更改或仅更改业务逻辑的更新.我尝试过这种方法,它大大减少了大多数更新的占用空间.但是,它也增加了部署的复杂性.