4

我目前是使用 JavaScript 构建 Windows 8 应用程序的团队的一员。我们正在使用 npm 和 browserify 来管理依赖项并将我们的模块转换为 AMD 浏览器友好的格式。

我们遇到的一个问题是疯狂的需求路径。这是因为我们的应用程序“组件”中有一个顶级文件夹。此文件夹包含一堆嵌套的 ui 组件/模块。这些模块有时需要 lib utils 和 helpers,它们位于 lib 目录中。

例如,位于“my/app/components/product/grid/item”中的模块可能需要位于“my/app/lib/helpers/view”的帮助模块。

require 路径有点疯狂而且非常丑陋: require("../../../../lib/helpers/view");

我们正在尽最大努力以模块化方式构建应用程序。现在我认为解决这个问题的正确方法是让我们的组件模块依赖于这些 util 辅助模块。我可以将 lib 助手放入他们自己的外部私有 git 存储库中,但这在让其他团队访问方面很痛苦(而且 git 私有存储库很慢)。另外,由于这些模块仅在应用程序中使用,因此进行更改、推送更改、然后返回应用程序和 npm 更新是浪费时间。这对某些人来说很好,但如果我们真的把它分解,它可能会很快变老。

我可以在组件 package.json 中执行 npm install "my/app/lib/helpers/view" 吗?但是 npm install 不会自动为我们执行此操作。

我知道解决这个问题的其他一些方法(NODE_PATH,可能使用 npm install hook 或 npm preinstall script),但想知道是否有其他人有类似的问题和好的解决方案。

4

3 回答 3

7

您可以将"my/app/components/product/grid/item"文件放入node_modules/grid/item.js其中,然后当您require('grid/item')在应用程序代码中时,您将使用更简洁的 require 路径语法获得所需的文件。只需node_modules/grid/item.js将其他文件检查到 git 中即可。该node_modules/目录甚至不需要位于顶层,因为 node 和 browserify 使用的 require 算法node_modules/将从当前路径一直搜索目录,/直到找到匹配的模块。

只需确保添加"grid""bundledDependencies"package.json 中的数组,这样您就不会意外在其上安装一些东西。

您可以阅读有关将节点模块检查到 git的更多信息。

阅读browserify 手册中关于避免 ../../../../../../的部分以获取更多信息。

NODE_PATH 总是一个坏主意,browserify 不支持它。永远不要使用它。

于 2013-03-09T21:23:24.430 回答
0

您可以做的一件事是在您的需求配置中为您的助手创建一个别名...

require.config({
    paths: {
        "helpers": "my/app/lib/helpers"    
    }
});

这会减少你的一些漫长的道路。

于 2013-03-09T17:52:43.693 回答
-1

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);
};

应用程序.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。

于 2013-03-09T23:30:42.243 回答