npm为自定义模块安装“没有这样的文件或目录'... / package.json'”

时间:2016-01-10 12:24:51

标签: node.js npm

我有一些符号链接到node_modules的文件夹,以便能够import将它们作为模块。例如,我有src/client/apps/admin目录,它与node_modules/@admin符号链接。但是当我尝试安装或删除任何模块时,npm给了我这些警告

$ npm i -S connect-roles
...

npm WARN ENOENT ENOENT: no such file or directory, open '/Users/Admin/Code/www/learn/src/client/apps/admin/assets/package.json'
npm WARN ENOENT ENOENT: no such file or directory, open '/Users/Admin/Code/www/learn/src/client/apps/admin/components/package.json'
npm WARN ENOENT ENOENT: no such file or directory, open '/Users/Admin/Code/www/learn/src/client/apps/admin/reducers/package.json'
npm WARN ENOENT ENOENT: no such file or directory, open '/Users/Admin/Code/www/learn/src/client/apps/admin/package.json'

当然,我可以将package.json添加到每个此类文件夹中,但我不想这样做。必须有另一种更好的方法来做到这一点。有吗?

PS:npm v3.5.3

3 个答案:

答案 0 :(得分:2)

您正试图以某种方式使用节点模块require / import,以后会导致您遇到问题。以一种不使用这些符号链接的方式构建项目会好得多。

导入模块时,您可以指定核心模块,项目 node_modules 中安装的模块或相对路径:

核心模块(例如require('http')
核心模块作为节点的一部分包含在内,只需按名称导入即可。

已安装的模块(例如require ('bluebird')
已通过npm安装并位于项目_node_modules_目录中的模块可以使用package.json中声明的名称进行安装。

相对路径(例如require('../settings/menu')
可以使用相对于导入文件的路径导入模块(可以是没有包定义的单个文件)。

因为你没有提供package.json,所以npm失败了,因为它无法查找每个包的name属性。如果你只是使用相对路径来要求这些文件,你会好得多。

例如,如果您的项目类似于:

apps  
│
└───admin
    │   assets.js
    │   components.js
    |   reducers.js
    │
    ├───subfolder
    │   │   thing.js

您可以使用相对路径将一个文件导入另一个文件。

例如,在components.js

require ('./assets')

thing.js

require ('../assets')

如果你有很多非常嵌套的路径,这可能会变得有点麻烦,但有许多建议的方法可以处理。一种方法是使用path.resolve(),它将解决相对路径,给定项目路径的路径。

例如:

require ('../assets')

可以重写为

require (path.resolve('app/admin/assets'))

所有需求路径都是项目根目录中的“绝对”结果。

您可以在Better local require() paths for Node js

中阅读更多建议的处理方法

答案 1 :(得分:-1)

这些答案都没有帮助我解决问题所以我创建了自己的包module-alias,其灵感来自app-module-path。此软件包允许注册目录别名,以便require / import进一步使用。

示例:

const moduleAlias = require('module-alias')

moduleAlias.addAliases({
  '@root'  : __dirname,
  '@server': __dirname + '/src/server'
})

const someModule = require('@server/some-module')

阅读自述文件以获取更多示例

答案 2 :(得分:-2)

尝试此命令:

npm install -g npm-autoinit