【问题标题】:ES6 import, node libraries and my modulesES6 导入、节点库和我的模块
【发布时间】:2018-07-10 01:52:02
【问题描述】:

我正在学习node,但之前从未使用过ES6/javascript/TypeScript,所以请多多包涵……

我正在尝试用普通的 ES6 编写 nodejs 应用程序。从下面的例子(取自here),

import fs from 'fs';
export default class Animal {

  constructor(name){
    this.name = name ;
  }

  print(){
    console.log('Name is :'+ this.name);
  }
}

import Animal from 'path/to/Animal.js';

我们可以看到imports有两种种,require的ES6方式。一种是无路径(import fs from 'fs';),另一种是有路径。

所以我的第一个困惑是,here 它说,

为了与 CommonJS 兼容并为将来的功能做准备,不允许不以 ./ 或 ../ 开头的相对路径(在 ES6 中):

// Not allowed:
import * as foo from 'foo.mjs';
import * as foo from 'lib/foo.mjs';

那么import fs from 'fs' 是对还是错?

我正在尝试编写的普通 ES6 nodejs 应用程序基于 npm 模块,但因为它几乎每天都在更新,所以我从它的 git 中提取而不是做

npm install mydepmod

这又使得它的示例代码以

开头
import { mydepmod } from 'mydepmod'

不适合我。我得到的错误是,

module.js:557
    throw err;
    ^

Error: Cannot find module 'mydepmod'
    at Function.Module._resolveFilename (module.js:555:15)
    at Function.Module._load (module.js:482:25)
    at Module.require (module.js:604:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/path/to/example/the-test.js:19:21)
    at Module._compile (module.js:660:30)
    at Object.Module._extensions..js (module.js:671:10)
    at Module.load (module.js:573:32)
    at tryModuleLoad (module.js:513:12)
    at Function.Module._load (module.js:505:3)

所以我的最后一个问题是如何使它工作?

顺便说一句,我尝试从 docker(以 import { mydepmod } from 'mydepmod' 开头)安装和运行它的 docker 没有任何问题,所以我假设如果我这样做 npm install mydepmod,它应该也可以工作。

总而言之,我怎样才能让我的 git pull 依赖模块像 npm installed 一样工作。谢谢。

【问题讨论】:

  • 简单来说,没有路径的方式是node module,其他的是你的项目文件,这里有更多关于import的信息。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 是的,我在问如何将节点模块用作节点模块,甚至认为我没有做npm install,而是git get。请参阅我的 OP 以获取更新的错误消息,谢谢。 @Cr。
  • 不带路径如果不是nodejs核心模块,import会在项目文件夹下找到node_modulefloder,如果没有这个模块,会在一级目录下找到node_modulefloder直到根目录。如果没有,则抛出 not found 错误。
  • 啊,gotya @Cr.,多次阅读您的答案后,我想我知道我的问题的答案(接下来我会尝试)。谢谢!

标签: node.js npm ecmascript-6 npm-scripts


【解决方案1】:

当您使用带有前缀“./”的相对路径导入时,它会从该文件加载模块,您可以提供完整路径,如“/path/to/module”。

当你导入任何没有任何路径的模块时,节点会查找该模块

  • node_modules 文件夹中,在该目录中,或者在存在package.json 的任何父目录中
  • 如果无法从该目录加载模块,则节点尝试从用户目录中的全局node_modules 文件夹加载该模块(例如,/usr/lib/node_modules/)。
  • 如果节点在这个阶段加载模块失败,那么它会抛出错误说Can not find module

Here 详细描述了 require 的工作原理。 Require 和 Import/Export 类似,this 文章给出了 require 和 import/export 的区别。

关于本地node_modules和全局node_modules的区别,here是一个讨论。

全局node_modules的位置在不同的操作系统环境中是不同的。根据this 回答:

在 Unix 系统上,当全局安装时,它们通常放置在 /usr/local/lib/node/usr/local/lib/node_modules 中。如果将NODE_PATH环境变量设置为该路径,则可以通过node找到模块。

Windows XP - %USERPROFILE%\Application Data\npm\node_modules Windows 7、8 和 10 - %AppData%\npm\node_modules

【讨论】:

  • 谢谢!一旦我让我的 git pull 依赖模块像安装了 npm 的模块一样工作,我会回复你。顺便说一句,(我添加的)/usr/lib/node_modules/ 你的意思是 “在用户目录中”
  • Laxmikant:有没有注意到@Cr的回答,"import会在项目文件夹下找到node_module floder,如果没有这个模块,会在一级目录下找到node_module floder,直到根目录。”,和你的不一样?请你再检查一下哪个说法更正确?我的new reading 似乎表明了他的意思。谢谢!
猜你喜欢
  • 2016-06-07
  • 2016-06-07
  • 2015-09-13
  • 2017-06-29
  • 2020-08-24
  • 2020-12-30
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
相关资源
最近更新 更多