用于复杂应用结构的NodeJS本地模块

NodeJS local modules for complex application structures

本文关键字:模块 NodeJS 复杂 应用 结构 用于      更新时间:2023-09-26

我目前是使用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

最好的解决方案是定义自己的require函数并使其全局化。例如:

你的项目结构是:

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()。

请记住,node_modules只用于第三方模块,规则nº1。