用于复杂应用结构的NodeJS本地模块
NodeJS local modules for complex application structures
我目前是使用JavaScript构建Windows 8应用程序团队的一员。我们正在使用npm和browserify来管理依赖关系,并将我们的模块转换为AMD浏览器友好的格式。
我们遇到的一个问题是疯狂的需求路径。这是因为我们在应用程序的"组件"中有一个顶级文件夹。这个文件夹包含一堆嵌套的ui组件/模块。这些模块有时需要lib utils和helper,它们位于lib目录中。
例如,一个位于"my/app/components/product/grid/item"的模块可能需要一个位于"my/app/lib/helpers/view"的辅助模块。
require路径有点疯狂,非常难看:需要 ("../../../../lib/帮助/视图");
我们正在尽最大努力以模块化的方式构建应用程序。现在我认为解决这个问题的正确方法是让我们的组件模块依赖于这些util助手模块。我可以把这些库帮助器放到它们自己的外部私有git仓库中,但这让其他团队无法访问(加上git私有仓库很慢)。另外,由于这些模块只在应用程序中使用,所以进行更改、推送更改,然后返回到应用程序并进行npm更新是浪费时间。这对一些人来说是好的,但如果我们真的打破这个,它可能会很快过时。
我可以在组件包中执行npm install "my/app/lib/helpers/view"。json吗?但是npm install不会自动为我们做这些。
我知道有一些其他的方法(NODE_PATH,可能使用npm install钩子或npm preinstall脚本),但想知道是否有人有类似的问题和好的解决方案。
您可以将"my/app/components/product/grid/item"
文件放入node_modules/grid/item.js
中,然后当您在应用程序代码中使用require('grid/item')
时,您将使用更简洁的要求路径语法获得您想要的文件。只需将node_modules/grid/item.js
和其他文件检入git。node_modules/
目录甚至不需要在顶层,因为node和browserify使用的require算法将从当前路径一路搜索node_modules/
目录直到/
,直到找到匹配的模块。
确保将"grid"
添加到包中的"bundledDependencies"
数组中。Json,这样你就不会不小心在上面安装东西了。
你可以阅读更多关于检查节点模块到git的信息。
阅读browserify手册中关于避免../../../../../查看更多信息。
NODE_PATH总是一个坏主意,browserify不支持它。永远不要用它
你可以做的一件事是在你的require配置中为你的助手创建一个别名…
require.config({
paths: {
"helpers": "my/app/lib/helpers"
}
});
这将减少你的一些长路径
require()函数的问题是路径与当前文件是相对的。您可以将模块放在node_modules目录中,但这是最糟糕的做法。Node_modules是存放所有第三方模块的目录。如果你遵循这个简单的规则,它是非常容易和方便的,总是保持最新,你可以删除所有的依赖关系(删除node_modules),只做npm install
。
你的项目结构是:
my-project
| tools
|- docs
|- logs
|- conf
`- src
|- node_modules
|- package.json
|- mod.js
|- a
| `- b
| `- c.js
`- d
`- app.js
mod.js
global.mod = function (file){
return require ("./" + file);
};
app.js
//This should be the first line in your main script
require ("../mod");
//Now all the modules are relative from the `src` directory
//You want to use the a/b/c.js module
var c = mod ("a/b/c");
就是这样,很简单。如果你想获取位于node_modules中的第三方模块,请使用require()。如果你想获得自己的模块,使用mod()。
- 导出模块 NodeJS 时出现问题
- 如何从NodeJS中的模块返回数组
- nodeJS中的uglify js“;找不到模块“”;
- 如何解压缩NodeJS请求's模块gzip响应体
- Nodejs模块函数返回未定义的,而不是异步的
- Nodejs模块文件和concat
- 将路由处理程序委托给NodeJS+Express中的其他模块
- NodeJS请求模块-http上的body.IncomingMessage
- NodeJS:一个全局EventEmitter或每个模块它'他自己的
- NodeJS 是否重用已经加载的模块并共享其值?
- 如何使用nodejs步行模块将目录遍历到第一级
- 将 NodeJS 模块范围变量作为对象访问
- 从导出的模块返回变量,并在另一个文件(NodeJS)中使用它
- 为什么“exports”在nodejs模块中引用与“this”相同的对象
- 对NodeJS模块开发的怀疑
- NodeJS Semaphore模块:它是如何工作的
- 全局安装的NodeJS npm模块不执行节点的主/bin JavaScript文件
- 如何在nodejs中模块化代码
- 带有参数的模块 NodeJS
- 使用请求模块nodejs下载文件时需要filename