Azure和节点js __dirname

时间:2016-07-03 20:22:18

标签: node.js azure webpack

可能它与webpack / memory-f没有特别关系,但我收到RangeError: Maximum call stack size exceeded错误(请参阅下面的调用堆栈)。

我发现,在我的情况下,Azure上的__dirname(webapp)会返回\\100.78.172.13\volume-7-default\8f5ecde749dace2bb57a\4e07195f015b45ce8e9ba255dc901988\site\repository\Source\Website\Content\app\node_modules\webpack\node_modules\memory-fs\lib\normalize.js,而process.cwd()会返回D:\home\site\repository\Source\Website\Content\app

是否可以从我这边做任何事情来配置节点js以返回D:\...而不是\\..

Gist

如何重现:

  1. 克隆https://github.com/intellismiths/webapp1存储库。
  2. 创建新的Azure Web App(默认设置)。
  3. 配置部署源以使用GitHub。
  4. 点击Sync。它需要10多分钟才能完成,它将显示部署成功。
  5. 转到Azure中的应用程序设置,将WEBSITE_NODE_DEFAULT_VERSION更改为6.2.2
  6. 转到kudu页面并打开powershell控制台。
  7. 执行npm cache clean
  8. 执行node -v检查节点版本。它应该是v6.2.2
  9. 在Azure上,导航至D:\home\site\respository\src\WebApp1
  10. 执行npm run build
  11. 在控制台中,您应该看到很多错误,表明无法解析模块
  12. 可选的。在本地计算机上测试npm run build - 它应该生成wwwroot/app.js而不会出错。
  13. 更新webpack.config.js以包含context: __dirname以修复以前的错误。
  14. 执行npm run build
  15. 在控制台中,您应该看到" RangeError:超出最大调用堆栈大小"错误。
  16. 更新1

    我只是在添加第二个package.json之后才尝试设置6.2.2运行时,因此项目结构不是最简单的。也许只是将节点设置为6.2.2就会破坏构建。

5 个答案:

答案 0 :(得分:4)

我可以按照您的步骤重现您的问题。我发现关键点是将WEBSITE_NODE_DEFAULT_VERSION设置为6.2.2。如果WEBSITE_NODE_DEFAULT_VERSION位于6下,我发现webpack任务正常。

请将设置WEBSITE_NODE_DEFAULT_VERSION降级为6下的版本,例如5.9.0如果你的node.js模块不需要这么高的版本 根据angular2的package.json:http://github.com/angular/angular/blob/master/package.json,似乎angular2存储库需要5.4和{之间的node.js版本{1}}。

此外,Azure Web Apps上的Web应用程序根目录为6。因此,如果要在Azure Web Apps上构建前端项目,则需要找到D:\home\site\wwwroot,然后运行D:\home\site\wwwroot\wwwroot\mobile-web-app

答案 1 :(得分:2)

已在master中修复,并建议将其包含在v6.4.0中。

请参阅:https://github.com/nodejs/node/issues/7175#issuecomment-239824532https://github.com/nodejs/node/pull/8070

答案 2 :(得分:1)

经过一整天的研究,反复试验和各种实验,如果您 愿意降级到节点5,我找到了一个可接受的解决方法。* :

  • 降级到节点6.1.0
  • 确保全局安装webpack (使用npm install -g webpack)。

只需使用6.1.0即可绕过"超出最大调用堆栈大小"错误,但在从node_modules运行webpack时使用./node_modules/.bin/webpack)给了我很多解决方法失败。全球安装webpack终于让我超越了它。

如果我理解正确,那么解析到UNC文件夹路径而不是已安装路径的节点> = 6.2中的__dirname的整个问题将得到修复,这是一个积极的讨论{ {3}}

答案 3 :(得分:0)

我相信你的__dirname显示了存储数据的持久驱动器,而.cwd给出了节点运行的当前目录。这是因为Azure从驱动器运行,但文件存储在永久驱动器中。

在你的Gruntfile.js中添加

module.exports = function (grunt) {  
  grunt.file.setBase(__dirname);  
  // Code omitted  
}  

参考:link

答案 4 :(得分:0)

我有同样的问题。 使用UPGRADING npm而不是DOWNGRADING来修复它。

错误修正在比6.5更新的npm版本中。

https://github.com/aumanjoa/chronas-community/blob/master/package.json#L48