在无法获取父模块的模块中使用 npm3 node_modules
Using npm3 within a module unable to get parent node_modules
不确定这是否是 npm3
的已知问题,但由于 npm3
的平面模块结构,在模块中,我无法使用 node_modules
var node_modules = fs.readdirSync('node_modules');
相反,我必须使用,
var node_modules = fs.readdirSync('../../node_modules');
向上遍历找到它。这显然不会发生在 npm2+ 中,因为 node_modules
嵌套在包中。
有办法解决这个问题吗?我到处寻找更好的解决方案。
这可能是一个糟糕的设计。我不确定您为什么需要手动定位 node_modules
;如果您确定已经安装了某些东西,请使用内置的 require.resolve()
,它会为您找到软件包。请注意,您不仅可以 require.resolve()
文件,还可以 package.json
所需包的文件,这有助于找到已安装包的根目录。
编辑:
如果您尝试使用 webpack 来捆绑服务器代码,您可以手动定义外部:
var nodeModules = {};
fs.readdirSync('node_modules') // this always exists
.filter(function(x) {
return ['.bin'].indexOf(x) === -1;
})
.forEach(function(mod) {
nodeModules[mod] = 'commonjs ' + mod;
})
然后在 webpack 配置中:
externals: nodeModules,
不确定这是否是 npm3
的已知问题,但由于 npm3
的平面模块结构,在模块中,我无法使用 node_modules
var node_modules = fs.readdirSync('node_modules');
相反,我必须使用,
var node_modules = fs.readdirSync('../../node_modules');
向上遍历找到它。这显然不会发生在 npm2+ 中,因为 node_modules
嵌套在包中。
有办法解决这个问题吗?我到处寻找更好的解决方案。
这可能是一个糟糕的设计。我不确定您为什么需要手动定位 node_modules
;如果您确定已经安装了某些东西,请使用内置的 require.resolve()
,它会为您找到软件包。请注意,您不仅可以 require.resolve()
文件,还可以 package.json
所需包的文件,这有助于找到已安装包的根目录。
编辑:
如果您尝试使用 webpack 来捆绑服务器代码,您可以手动定义外部:
var nodeModules = {};
fs.readdirSync('node_modules') // this always exists
.filter(function(x) {
return ['.bin'].indexOf(x) === -1;
})
.forEach(function(mod) {
nodeModules[mod] = 'commonjs ' + mod;
})
然后在 webpack 配置中:
externals: nodeModules,