【问题标题】:Importing node modules once for whole project为整个项目导入一次节点模块
【发布时间】:2019-03-26 05:03:49
【问题描述】:

场景

所以,我已经用 npm 初始化了一个 Node 项目。我已经相应地设置了我的 package.json。我正在使用打字稿,所以我也设置了 tsconfig.json。

我有一些依赖项(npm 包)需要在项目的多个文件中多次使用。 index.ts 是我项目的根。我也可以在 index.js 和其他文件中导入这些库。

问题

有没有办法在项目中只包含或导入这些库一次,这样我就可以在项目的任何文件中使用它们,而不必在任何地方导入任何东西。

我尝试搜索各种方法来做到这一点 - CommonJS 模块语法、NodeJS 模块语法、全局模块——但没有一个能提供我想要的方式。

前-

我得到的大部分答案或解决方案都是这样的

  • 通过单个文件导出所有库

    import abc from 'abc';
    import xyz from 'xyz';
    
    module.exports = {
        abc, xyz
    };
    
  • 在其他文件中使用这些库,例如

    import modules from 'src/modules.ts'
    
    var wantSome = modules.abc.getSome();
    

但是,这仍然需要导入模块文件并像 modules.abc 一样访问它。

我们有什么方法可以在整个项目中使这些导入在全球范围内可用。

附: - 这个场景有点类似于 Angular 2+ 中的 ngModules,我们可以在 ngModules 中导入我们想要的任何内容,然后该模块下的所有组件都可以使用它。

【问题讨论】:

  • 你展示的例子是你想要的最好的。为什么你可以那样使用它?另一种选择是将它们存储在全局变量中,但这不合适。或者更好的是,只需在需要时导入每个文件。如果您已经导入了库,Nodejs 不会重新导入它,它将使用缓存的值
  • 我不想使用它,因为我看到 Angular 的 ngModule 具有我需要的功能。因此,必须有某种方法在普通节点应用程序中使用 CommonJS 模块模式或类似的东西来实现它!由于这种方式,我已经提到了开销。我想消除它!
  • 可能有一个这样的库,但对于你的 nodejs 应用来说这是一个错误的设计
  • 有什么理由要使用 import 如何在 Angular 中使用它?喜欢表演吗?
  • 易于使用!就这样。只需指定您要在项目中使用的内容,不用担心将其导入到具有相同导入语句的大量文件中!

标签: node.js typescript node-modules commonjs ng-modules


【解决方案1】:

N/B - 这是设计应用的糟糕方式。


在节点中,可以通过“global”或“GLOBAL”对象设置全局变量:

您可以在应用入口文件中导入所有依赖项,并将它们存储在全局变量中

index.js

import abc from 'abc';
import xyz from 'xyz';

global.abc = abc
global.xyz = xyz

someotherfile.js

//access abc import
global.abc

【讨论】:

  • 能否请您详细说明为什么这是一种糟糕的设计方式?
  • 您将污染全局范围,如果发生错误,您将不知道哪个文件是罪魁祸首,因为一切都是全局的
  • 好的,谢谢您的回答。如果这是一个糟糕的设计,让我们看看是否有其他人有想法以 Angular 的方式实现它!
【解决方案2】:

从长远来看,这样做会给您带来各种问题。

  • 您最终会得到一个包含所有导出内容的单一文件,这将变得难以维护
  • 如果您决定模块化您的代码,这将更加困难,因为您不会明确知道文件使用哪些模块
  • 如果您能够包含到只使用没有引用的模块的地步,代码清晰度就会受到影响
  • 可能会发生名称冲突

我相信你在 node 中得到的最好的方法是在一个模块中声明所有包含,然后在你自己的文件中解构。

import abc from 'abc';
import xyz from 'xyz';

module.exports = {
    abc, xyz
};

然后

import modules from 'src/modules.ts'
{ abc: { getSome } } = modules

但我强烈建议使用标准模式进行导入。它将使您的代码更简洁,更易于维护

【讨论】:

    【解决方案3】:

    通过单个文件导出所有库

    import abc from 'abc';
    import xyz from 'xyz';
    
    module.exports = {
        abc, xyz
    };
    

    在其他文件中使用这些库,例如

    import {abc, xyz} from 'src/modules.ts'
    
    var wantSome = abc.getSome();
    

    【讨论】:

    • 这是什么鬼?
    猜你喜欢
    • 2023-04-11
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2021-11-10
    • 2021-12-25
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多