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

nit*_*918 6 javascript import module node.js npm

我理解当你想在多个地方重用一个模块时。您可以: module.exports = yourModuleClassNamein 使该模块可导出。

接下来,当您想在其他地方使用它时,只需导入它即可,如下所示:import yourModuleClassName from 'yourmodulePath'

我完全理解上述概念,对此我没有任何疑问。今天,我更关心的是,导入包时会发生什么:

就像导入 redux-form 包一样:

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

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

现在,当我查看 npm 安装的软件包时。例如; 当我查看redux-form我的文件夹下的文件夹时node-modules。这是一个完整的项目,有server.js自己package.json的项目,其他项目npm package installs也发生同样的情况。我完全明白它们是一个独立的模块(但更大),并且它们的工作方式与我的本地独立模块相同。

但我在那里没有找到任何东西module.exports,那么它们如何导入呢?当然,NODEJS我正在施展一些魔法,让它们在我的所有项目中都可以导入。但是,它到底是如何做到的呢?假设我在 node_modules 文件夹中保存了一个模块,但我不认为它是可导入的(我知道没有人会这样做,只是好奇!)。如果NODE负责使其可导入,那么它如何处理我不想导入但我希望它们位于文件夹中的文件node_modules

此外,这些模块都有自己的模块server.jswebpack.configs当我在这些包上调用 import 时它们是否会被执行,如果没有,那么它们到底是如何工作的。

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

感谢致敬。

Nic*_*olò 2

当导入使用 npm 安装的包时,node 会执行以下步骤:

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

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


此外,这些模块有自己的 server.js 和 webpack.configs,当我在这些包上调用 import 时它们会被执行吗?如果没有,那么它们到底是如何工作的。

webpack.config.js是构建工具 Webpack 的配置。Webpack 仅由开发人员redux-form在将包发布到 npm 之前执行:当您使用npm install它时,它已经构建/编译了

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


PS您正在混合使用模块的两种方式:CommonJS 和 ES6。它可以工作,因为您正在转译模块(可能使用 Babel 或任何其他转译器),但当 Node 原生支持 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";
Run Code Online (Sandbox Code Playgroud)