首页 技术 正文
技术 2022年11月13日
0 收藏 376 点赞 4,501 浏览 1488 个字

转载自:http://blog.leapoahead.com/2015/09/03/prevent-node-require-dot-hell/

在Node应用中,我们使用require来加载模块。在目录层次相对复杂的应用中,总是会出现类似require('../../../../../module')的调用,我把它称之为Dot Hell。我用了一些时间研究现有的解决方案,并介绍我个人认为最好的方法。

在Node中的全局对象是global,它就像浏览器的window对象一样。global对象下面的方法都可以直接调用。

12 global.a = 1require(‘assert’).equal(1, a)

因此最简单的方法,也是我认为最好的方式就是在global下创建一个appRequire方法作为require方法的包装,appRequire方法专门用于调用应用内的包。

1234 var path = require(‘path’)global.appRequire = function(path) {return require(path.resolve(__dirname, path))}

假设我们的项目目录结构如下

12345678 ├── app│   ├── controller│   │   └── AppController.js│   ├── model│   │   └── User.js│   └── view│   └── AppView.js└── app.js

其中app.js是应用的入口。那么我们只需要在app.js中应用上面的代码,那么在整个应用程序中就都可以使用了。

例如,现在在app/controller/AppController.js中,我们可以用下面的语句调用app/model/User.js

1 var User = appRequire(‘app/model/User’)

Oh Yeah! 一切都很优雅,很顺利。

但是一个应用中一定还会有测试代码。以单元测试为例,我们如果用mocha之类的Task Runner去运行测试的话,就得在每个测试前面都加上这一段代码,这样做很容易出错,而且很麻烦。

所以,我们可以把上述的封装代码单独封装成一个文件global-bootstrap.js,在运行mocha的时候,用mocha的require参数来指定每次运行测试之前要加载global-bootstrap.js

123 # 用Mocha运行tests文件夹下面的所有测试# 在运行的时候加载should库,以及我们封装的含有appRequire函数的文件mocha –require should –require global-bootstrap.js –recursive tests

其他方案

对于解决这个问题,还有两种方案:NODE_ENV方案(及其变种)Symlink方案,你可以在这里看到。

我认为应该避免使用这两种方案。虽然这两种方案都可行,但是它们都会可能导致应用自身的目录名和node模块名冲突。例如,在下面的结构中,使用require('request')就很容易产生二义性。

12345 .├── node_modules│   └── request└── request└── index.js

总结

我一直认为Node的模块引用方式的设计是有问题的,Dot Hell就很能说明这点。而Python相对而言就优雅很多,你可以直接通过路径的形式来导入包(在正确配置的情况下)。本文的解决方案允许我们用类似Python的方式去加载模块,你可以在我的项目webcraft中看到其应用。

在Node应用中避免“Dot Hell”

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,966
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,487
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,332
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,115
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,748
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,783