我想始终通过项目的根目录而不是相对于当前模块来要求文件。
例如,如果您查看https://github.com/visionmedia/express/blob/2820f2227de0229c5d7f28009aa432f9f3a7b5f9/examples/downloads/app.js第6行,您将看到
express = require('../../')
这真是糟糕的IMO。想象一下,我只想将我所有的例子都更靠近根源。那将是不可能的,因为我将不得不在每个示例中多次更新30多个示例。对此:
express = require('../')
我的解决方案是为基于root的情况提供特殊情况:如果字符串以$开头,则它相对于项目的根文件夹。
任何帮助表示赞赏,谢谢
更新2
现在,我正在使用require.js,它允许您以一种方式编写并在客户端和服务器上均可使用。Require.js还允许您创建自定义路径。
更新3
现在,我移至webpack + gulp,并使用Enhanced-require处理服务器端的模块。请参阅此处的基本原理:http : //hackhat.com/p/110/module-loader-webpack-vs-requirejs-vs-browserify/
我们将尝试一种新方法来解决此问题。
以其他已知项目(例如spring和guice)为例,我们将定义一个“ context”对象,其中将包含所有“ require”语句。
然后,该对象将传递给所有其他模块使用。
例如
这就要求我们将每个模块编写为一个接收opts的函数,无论如何,这对我们来说都是一种最佳实践。
然后您将引用上下文,而不需要任何内容。
var module1Ref = context.moduel1;
如果愿意,您可以轻松编写一个循环来执行require语句
当您要模拟(测试)时,这应该使工作变得更轻松,并且在使代码作为包可重用的同时解决了您的问题。
您还可以通过将bean声明与上下文初始化代码分开来重用上下文初始化代码。例如,您的
main.js
文件可能看起来像这样此方法也适用于外部库,不需要在每次需要它们时都对其名称进行硬编码-但是,由于它们的导出不是期望上下文的函数,因此将需要特殊对待。
稍后,我们还可以将bean定义为函数-允许我们
require
根据环境使用不同的模块-但它超出了该线程的范围。