节点如何进行依赖关系分析并删除未使用的模块依赖关系

时间:2016-07-25 20:47:19

标签: node.js npm node-modules

我的节点模块是一个简单的模块,具有很少的依赖关系,主要使用内置模块。 鉴于此,我的模块具有声明这些依赖性的模块的依赖性

"dependencies": {
    "events": "^1.1.1",
    "geocoder": "^0.2.2",
    "gpsoauthnode": "^0.0.5",
    "istanbul": "^0.4.4",
    "protobufjs": "^5.0.1",
    "request": "^2.73.0",
    "s2geometry-node": "^1.3.0",
    "tape": "^4.6.0"
  }

运行npm install将最终出现在以下node_submodules

├─┬ body-parser@1.15.2 
│ ├── bytes@2.4.0 
│ ├── content-type@1.0.2 
│ ├─┬ debug@2.2.0 
│ │ └── ms@0.7.1 
│ ├── depd@1.1.0 
│ ├─┬ http-errors@1.5.0 
│ │ ├── inherits@2.0.1 
│ │ ├── setprototypeof@1.0.1 
│ │ └── statuses@1.3.0 
│ ├── iconv-lite@0.4.13 
│ ├─┬ on-finished@2.3.0 
│ │ └── ee-first@1.1.1 
│ ├── qs@6.2.0 
│ ├─┬ raw-body@2.1.7 
│ │ └── unpipe@1.0.0 
│ └─┬ type-is@1.6.13 
│   └── media-typer@0.3.0 
├─┬ express@4.14.0 
│ ├─┬ accepts@1.3.3 
│ │ └── negotiator@0.6.1 
│ ├── array-flatten@1.1.1 
│ ├── content-disposition@0.5.1 
│ ├── cookie@0.3.1 
│ ├── cookie-signature@1.0.6 
│ ├── encodeurl@1.0.1 
│ ├── escape-html@1.0.3 
│ ├── etag@1.7.0 
│ ├── finalhandler@0.5.0 
│ ├── fresh@0.3.0 
│ ├── merge-descriptors@1.0.1 
│ ├── methods@1.1.2 
│ ├── parseurl@1.3.1 
│ ├── path-to-regexp@0.1.7 
│ ├─┬ proxy-addr@1.1.2 
│ │ ├── forwarded@0.1.0 
│ │ └── ipaddr.js@1.1.1 
│ ├── range-parser@1.2.0 
│ ├─┬ send@0.14.1 
│ │ ├── destroy@1.0.4 
│ │ └── mime@1.3.4 
│ ├── serve-static@1.11.1 
│ ├── utils-merge@1.0.0 
│ └── vary@1.1.0 
├─┬ pokemon-go-node-api@1.3.1
│ ├── events@1.1.1 
│ ├─┬ geocoder@0.2.2 
│ │ ├─┬ request@2.11.1 
│ │ │ ├─┬ form-data@0.0.3 
│ │ │ │ ├── async@0.1.9 
│ │ │ │ └─┬ combined-stream@0.0.3 
│ │ │ │   └── delayed-stream@0.0.5 
│ │ │ └── mime@1.2.7 
│ │ ├── underscore@1.3.3 
│ │ └─┬ xml2js@0.2.0 
│ │   └── sax@1.2.1 
│ ├─┬ gpsoauthnode@0.0.5 
│ │ └── crypto-js@3.1.6 
│ ├─┬ istanbul@0.4.4 
│ │ ├── abbrev@1.0.9 
│ │ ├── async@1.5.2 
│ │ ├─┬ escodegen@1.8.0 
│ │ │ ├── estraverse@1.9.3 
│ │ │ ├── esutils@2.0.2 
│ │ │ ├─┬ optionator@0.8.1 
│ │ │ │ ├── deep-is@0.1.3 
│ │ │ │ ├── fast-levenshtein@1.1.4 
│ │ │ │ ├── levn@0.3.0 
│ │ │ │ ├── prelude-ls@1.1.2 
│ │ │ │ └── type-check@0.3.2 
│ │ │ └─┬ source-map@0.2.0 
│ │ │   └── amdefine@1.0.0 
│ │ ├── esprima@2.7.2 
│ │ ├─┬ fileset@0.2.1 
│ │ │ └─┬ minimatch@2.0.10 
│ │ │   └─┬ brace-expansion@1.1.6 
│ │ │     ├── balanced-match@0.4.2 
│ │ │     └── concat-map@0.0.1 
│ │ ├─┬ handlebars@4.0.5 
│ │ │ ├─┬ optimist@0.6.1 
│ │ │ │ ├── minimist@0.0.10 
│ │ │ │ └── wordwrap@0.0.3 
│ │ │ ├── source-map@0.4.4 
│ │ │ └─┬ uglify-js@2.7.0 
│ │ │   ├── async@0.2.10 
│ │ │   ├── source-map@0.5.6 
│ │ │   └── uglify-to-browserify@1.0.2 
│ │ ├─┬ js-yaml@3.6.1 
│ │ │ └─┬ argparse@1.0.7 
│ │ │   └── sprintf-js@1.0.3 
│ │ ├─┬ mkdirp@0.5.1 
│ │ │ └── minimist@0.0.8 
│ │ ├── nopt@3.0.6 
│ │ ├─┬ once@1.3.3 
│ │ │ └── wrappy@1.0.2 
│ │ ├── resolve@1.1.7 
│ │ ├─┬ supports-color@3.1.2 
│ │ │ └── has-flag@1.0.0 
│ │ ├─┬ which@1.2.10 
│ │ │ └── isexe@1.1.2 
│ │ └── wordwrap@1.0.0 
│ ├─┬ protobufjs@5.0.1 
│ │ ├─┬ ascli@1.0.0 
│ │ │ ├── colour@0.7.1 
│ │ │ └── optjs@3.2.2 
│ │ ├─┬ bytebuffer@5.0.1 
│ │ │ └── long@3.2.0 
│ │ ├─┬ glob@5.0.15 
│ │ │ ├── inflight@1.0.5 
│ │ │ └── path-is-absolute@1.0.0 
│ │ └─┬ yargs@3.10.0 
│ │   ├── camelcase@1.2.1 
│ │   ├─┬ cliui@2.1.0 
│ │   │ ├─┬ center-align@0.1.3 
│ │   │ │ ├─┬ align-text@0.1.4 
│ │   │ │ │ ├─┬ kind-of@3.0.3 
│ │   │ │ │ │ └── is-buffer@1.1.3 
│ │   │ │ │ ├── longest@1.0.1 
│ │   │ │ │ └── repeat-string@1.5.4 
│ │   │ │ └── lazy-cache@1.0.4 
│ │   │ ├── right-align@0.1.3 
│ │   │ └── wordwrap@0.0.2 
│ │   ├── decamelize@1.2.0 
│ │   └── window-size@0.1.0 
│ ├─┬ s2geometry-node@1.3.1 
│ │ └── bindings@1.2.1 
│ └─┬ tape@4.6.0 
│   ├── deep-equal@1.0.1 
│   ├── defined@1.0.0 
│   ├── function-bind@1.1.0 
│   ├─┬ glob@7.0.5 
│   │ ├── fs.realpath@1.0.0 
│   │ └── minimatch@3.0.2 
│   ├── has@1.0.1 
│   ├── minimist@1.2.0 
│   ├── object-inspect@1.2.1 
│   ├── resumer@0.0.0 
│   ├─┬ string.prototype.trim@1.1.2 
│   │ ├─┬ define-properties@1.1.2 
│   │ │ ├── foreach@2.0.5 
│   │ │ └── object-keys@1.0.11 
│   │ └─┬ es-abstract@1.5.1 
│   │   ├─┬ es-to-primitive@1.1.1 
│   │   │ ├── is-date-object@1.0.1 
│   │   │ └── is-symbol@1.0.1 
│   │   ├── is-callable@1.1.3 
│   │   └── is-regex@1.0.3 
│   └── through@2.3.8 
├─┬ request@2.74.0 
│ ├── aws-sign2@0.6.0 
│ ├── aws4@1.4.1 
│ ├─┬ bl@1.1.2 
│ │ └─┬ readable-stream@2.0.6 
│ │   ├── core-util-is@1.0.2 
│ │   ├── isarray@1.0.0 
│ │   ├── process-nextick-args@1.0.7 
│ │   ├── string_decoder@0.10.31 
│ │   └── util-deprecate@1.0.2 
│ ├── caseless@0.11.0 
│ ├─┬ combined-stream@1.0.5 
│ │ └── delayed-stream@1.0.0 
│ ├── extend@3.0.0 
│ ├── forever-agent@0.6.1 
│ ├── form-data@1.0.0-rc4 
│ ├─┬ har-validator@2.0.6 
│ │ ├─┬ chalk@1.1.3 
│ │ │ ├── ansi-styles@2.2.1 
│ │ │ ├── escape-string-regexp@1.0.5 
│ │ │ ├─┬ has-ansi@2.0.0 
│ │ │ │ └── ansi-regex@2.0.0 
│ │ │ ├── strip-ansi@3.0.1 
│ │ │ └── supports-color@2.0.0 
│ │ ├─┬ commander@2.9.0 
│ │ │ └── graceful-readlink@1.0.1 
│ │ ├─┬ is-my-json-valid@2.13.1 
│ │ │ ├── generate-function@2.0.0 
│ │ │ ├─┬ generate-object-property@1.2.0 
│ │ │ │ └── is-property@1.0.2 
│ │ │ ├── jsonpointer@2.0.0 
│ │ │ └── xtend@4.0.1 
│ │ └─┬ pinkie-promise@2.0.1 
│ │   └── pinkie@2.0.4 
│ ├─┬ hawk@3.1.3 
│ │ ├── boom@2.10.1 
│ │ ├── cryptiles@2.0.5 
│ │ ├── hoek@2.16.3 
│ │ └── sntp@1.0.9 
│ ├─┬ http-signature@1.1.1 
│ │ ├── assert-plus@0.2.0 
│ │ ├─┬ jsprim@1.3.0 
│ │ │ ├── extsprintf@1.0.2 
│ │ │ ├── json-schema@0.2.2 
│ │ │ └── verror@1.3.6 
│ │ └─┬ sshpk@1.8.3 
│ │   ├── asn1@0.2.3 
│ │   ├── assert-plus@1.0.0 
│ │   ├─┬ dashdash@1.14.0 
│ │   │ └── assert-plus@1.0.0 
│ │   ├── ecc-jsbn@0.1.1 
│ │   ├─┬ getpass@0.1.6 
│ │   │ └── assert-plus@1.0.0 
│ │   ├── jodid25519@1.0.2 
│ │   ├── jsbn@0.1.0 
│ │   └── tweetnacl@0.13.3 
│ ├── is-typedarray@1.0.0 
│ ├── isstream@0.1.2 
│ ├── json-stringify-safe@5.0.1 
│ ├─┬ mime-types@2.1.11 
│ │ └── mime-db@1.23.0 
│ ├── node-uuid@1.4.7 
│ ├── oauth-sign@0.8.2 
│ ├── stringstream@0.0.5 
│ ├── tough-cookie@2.3.0 
│ └── tunnel-agent@0.4.3 
└─┬ tough-cookie-filestore@0.0.1 
  └─┬ tough-cookie@0.12.1 
    └── punycode@2.0.0 

这不亚于

node_modules admin$ du -d0 -h
 40M    .
40公斤,什么?起初看起来我有点惊讶,因为依赖列表似乎太多了。我希望来自Makefile低级C库的Boostlibcryptolibxmllibsslnode或其他所使用的C / C ++库。一个操作系统,但是,嘿,等等,这只是一个使用内置库和一个外部依赖的简单应用程序。那么,这里发生了什么?

认真一点,我的问题是:有没有办法对通过npm安装的Configuration conf = BigtableConfiguration.configure(projectId, instanceId); if(!Strings.isNullOrEmpty(host)){ conf.set(BigtableOptionsFactory.BIGTABLE_HOST_KEY, host); conf.set(BigtableOptionsFactory.BIGTABLE_PORT_KEY, Integer.toString(port)); } connection = BigtableConfiguration.connect(configuration); try (Table table = connection.getTable("tName")){ table.put(<Put instance>); } 个软件包进行静态分析?然后修剪未使用的依赖项? 当然,我的模块在运行时不会在这个树中定义的每个模块的私有范围内使用大多数函数声明。

0 个答案:

没有答案