2013-03-09 51 views
3

我目前是使用JavaScript构建Windows 8应用程序团队的一员。 我们使用npm和browserify来管理依赖关系,并将我们的模块转换为AMD浏览器友好格式。用于复杂应用程序结构的NodeJS本地模块

我们遇到的一个问题是疯狂的需要路径。这是因为我们的应用程序“组件”中有一个顶级文件夹。该文件夹包含一堆嵌套的UI组件/模块。这些模块有时需要驻留在lib目录中的lib utils和helper。

因此,例如,生活在“我的/应用/组件/产品/格/项目”模块可能需要位于“我的/应用/ lib中/助理/视图”的辅助模块。

需求路径有点疯狂,非常难看: require(“../../../../ lib/helpers/view”);

我们正在尽最大努力以模块化方式构建应用程序。现在我认为解决这个问题的正确方法是让我们的组件模块依赖于这些util辅助模块。我可以将lib帮助器放到他们自己的外部私人仓库回购站中,但这对于让其他团队访问(加上git私人回购缓慢)而言已经很痛苦。另外,由于这些模块仅用于应用程序,所以进行更改,推送更改,然后返回到应用程序和npm更新是浪费时间。这对一些人来说很好,但如果我们真的把这个打破了,它可能会变得很快。

我所能做的NPM安装的组件的package.json里面的 “我的/应用/ lib中/助理/视图”?但是npm install不会自动为我们做这件事。

我知道其他一些方法(NODE_PATH,也许使用npm安装钩子或可能npm预安装脚本),但想知道是否有其他人有类似的问题和良好的解决方案。

+0

我现在的方法是运行一个批处理脚本,只要我们为NODE_PATH设置环境变量var。 – pbo 2013-03-09 19:11:05

+0

好吧,多玩点npm链接可能是去这里的路。我让我的应用程序模块具有package.json文件,在这些模块中的npm链接使它们可用,然后从顶层npm链接它们。只有这里吸取的东西是我需要确保我们npm链接在全新安装,因为npm install不会为我链接这些模块。 – pbo 2013-03-09 19:39:12

+0

我认为单独的回购就是要走的路。 – Domenic 2013-03-13 02:24:51

回答

0

有一件事你可能做的是在你需要的配置为您的助手的名称...

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

这将减少对你的一些很长的路径。

+0

这也适用于nodejs? – pbo 2013-03-09 18:32:51

+1

是的,我认为这只是前面的requirejs,我们没有使用。看上面,我们使用browserify来包装我们的模块。另外,我希望这个解决方案也可以在服务器上运行。 – pbo 2013-03-09 18:57:12

7

你可以把你的"my/app/components/product/grid/item"文件写入node_modules/grid/item.js,然后当你在应用程序代码中使用require('grid/item')时,你将得到你想要的文件,并且需要更多的需求路径语法。只需检查node_modules/grid/item.js和其他文件到git。该node_modules/目录甚至不必在顶层,因为由节点和browserify使用的需要算法将用于node_modules/目录搜索从目前的路径一路下跌到/,直到它找到一个匹配的模块。

只要确保将"grid"添加到您的package.json中的"bundledDependencies"数组中,以便您不会意外地在它上面安装某些东西。

你可以阅读更多关于checking node modules into git

阅读browserify handbook about avoiding ../../../../../../的部分获取更多信息。

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

+0

有趣。我知道NODE_PATH并不是最好的方法,但我最近刚刚观看了TJ的模块化网络应用视频(http://tjholowaychuk.com/post/38571504626/modular-web-applications-with-node-js-and-express)与快递和他提到使用NODE_PATH。 – pbo 2013-03-10 03:22:26

+0

是的,我们git忽略node_modules/*,但我认为shrinkwrap锁定所有的依赖关系,甚至依赖关系。这篇文章似乎没有提到这个事实。 – pbo 2013-03-10 03:24:44

+0

我宁愿不把它们放在顶层,所以就像你提到的那样,我可能会创建一个目录结构,其中顶级node_modules用于第三方,然后在我的lib文件夹中,应用程序本地模块可能有node_modules。我想这个方法的问题是你必须有一个本地模块的平面列表。 – pbo 2013-03-10 03:29:02

0

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。

+0

像require(“./”+ file)这样的自定义require函数不是静态可分析的,并且不适用于browserify。把你自己的模块放在'node_modules /'中是完全可以接受的,这就是为什么首先有''bundledDependencies''这样的事情的原因。 – substack 2013-03-10 03:45:32

+0

如果它与browserify不兼容,请将其与browserify兼容。我的解决方案比将内容放在node_modules里面更清洁 – 2013-03-10 09:32:42

相关问题