安装自定义模块时出现“找不到文件或目录'.../package.json'”的错误

6

我有一些文件夹链接到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个回答

2
您正在尝试以一种会在以后造成问题的方式使用节点模块require/import。更好的做法是以一种摆脱这些符号链接的方式构建您的项目。
导入模块时,可以指定核心模块、安装在项目内部的模块或相对路径: 核心模块(例如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 (path.resolve('app/admin/assets'))```
可以重写为:
```require ('../assets')```
这样做的好处是所有的require路径都是从您的项目根目录开始的。
您可以在Node.js 的更好的本地require()路径中了解更多处理此问题的建议方法。

1
感谢您的回复。当然,我知道可以使用相对路径。但是我的项目变得越来越大,有很多子文件夹,所以我厌倦了像这样以一种方式要求模块:import some from '../../../../../../some_module'import some from '../../../../../client/apps/admin/components/pages/some-page' - artnikpro
请参见上面的附加信息。 - duncanhall
谢谢提供链接!我会尝试其中一个建议,这个链接可能是我正在寻找的 https://www.npmjs.com/package/sp-load。希望它能解决我的问题。再次感谢! - artnikpro

-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

尝试运行此命令:

npm install -g npm-autoinit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接