当你在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.js
和package.json
,其他的npm package installs
也是如此。 我完全明白,他们是一个独立的模块(但更大一些),他们的工作方式与我本地的独立模块相同。
但是我没有在这里find任何module.exports
,所以它们是如何导入的。 当然, NODEJS
正在做一些神奇的事情,使得它们在我的项目中都是可导入的。 但是,究竟是如何做到这一点。 比方说,我在我的node_modules文件夹中保留了一个模块,但我不是可导入的(我知道没有人会这样做,只是好奇!)。 如果NODE
负责使其可导入,那么它如何关心我不想导入的文件,但我希望它们位于node_modules
文件夹中。
而且,这些模块有自己的server.js
和webpack.configs
,当我在这些包上调用导入时,它们是否会被执行,如果不是,那么它们究竟是如何工作的。
我问这个问题,因为我正在尝试做一个独立的npm package
,我想了解它们是如何工作的。 有一个类似的问题; 导入包时会发生什么? 但它更倾向于Python。 任何人都可以解释这个问题NODEJS。 如果网上有任何可用的资料,请在那里指导我,我将非常感谢。
感谢致敬。
当您导入使用npm安装的软件包时,节点将按照以下步骤操作:
- 它find了第一个
node_modules
文件夹- 包含在您从AND导入包的文件的祖先文件夹中
- 包含一个名为您正在导入的软件包的文件夹
- 如果软件包有一个
package.json
文件,并且该文件有一个main
域,- 节点加载
main
字段中设置的文件
- 节点加载
- 否则,节点加载
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";