当你在Javascript中“从someModule导入someModuleName”会发生什么?

我明白,当你想在几个地方重用一个模块。 你可以这样做: module.exports = yourModuleClassName ,使模块可导出。

接下来,当你想在其他地方使用它,你只需要导入它,就像这样: import yourModuleClassName from 'yourmodulePath'

我完全理解了上述概念,我毫不怀疑。 今天,我更关心的是,当你导入一个包时会发生什么:

像导入redux-form包一样:

所以首先我做: npm install redux-form

接下来会发生的事情是: import redux-form from redux-form在我的模块中使用它。

现在,当我看着一个npm安装包。 例如; 当我看着我的node-modules文件夹下的redux-form文件夹。 这是一个完整的项目,它自带了一个server.jspackage.json ,其他的npm package installs也是如此。 我完全明白,他们是一个独立的模块(但更大一些),他们的工作方式与我本地的独立模块相同。

但是我没有在这里find任何module.exports ,所以它们是如何导入的。 当然, NODEJS正在做一些神奇的事情,使得它们在我的项目中都是可导入的。 但是,究竟是如何做到这一点。 比方说,我在我的node_modules文件夹中保留了一个模块,但我不是可导入的(我知道没有人会这样做,只是好奇!)。 如果NODE负责使其可导入,那么它如何关心我不想导入的文件,但我希望它们位于node_modules文件夹中。

而且,这些模块有自己的server.jswebpack.configs ,当我在这些包上调用导入时,它们是否会被执行,如果不是,那么它们究竟是如何工作的。

我问这个问题,因为我正在尝试做一个独立的npm package ,我想了解它们是如何工作的。 有一个类似的问题; 导入包时会发生什么? 但它更倾向于Python。 任何人都可以解释这个问题NODEJS。 如果网上有任何可用的资料,请在那里指导我,我将非常感谢。

感谢致敬。

当您导入使用npm安装的软件包时,节点将按照以下步骤操作:

  1. 它find了第一个node_modules文件夹
    • 包含在您从AND导入包的文件的祖先文件夹中
    • 包含一个名为您正在导入的软件包的文件夹
  2. 如果软件包有一个package.json文件,并且该文件有一个main域,
    • 节点加载main字段中设置的文件
  3. 否则,节点加载index.js文件。

(来源: https : //nodejs.org/api/modules.html#modules_all_together )


而且,这些模块有自己的server.js和webpack.configs,当我在这些包上调用导入时,它们是否会被执行,如果不是,那么它们究竟是如何工作的。

webpack.config.js是一个构build工具webpack.config.js的configuration。 Webpack只能在npm上发布包之前由redux-form的开发者执行:当你npm install npm时,它已经被编译/编译

在一个节点包内, server.js只是一个普通文件(如foo.js )。 它只有在你的应用程序根目录下才有特殊的含义:当你运行npm start时它会被执行。


PS您正在混合两种使用模块的方式:CommonJS和ES6。 这是因为你正在模块化你的模块(也许使用Babel或者其他的编译器),但是当节点原生支持ES6模块时,它可能不起作用。

CommonJS和ES6模块有哪些区别?

 // commonjs module.exports = yourModuleClassName; // ES6 export default yourModuleClassName; // commonjs exports.something = yourExportedVariable; // ES6 export { yourExportedVariable as something } // commonjs var importedModule = require("module-path"); // ES6 import importedModule from "module-path"; // commonjs var something = require("module-path").something; // ES6 import { something } from "module-path";