Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用导入模块的命名别名不适用于导出名称的点表示法?_Javascript_Reactjs_Module - Fatal编程技术网

Javascript 使用导入模块的命名别名不适用于导出名称的点表示法?

Javascript 使用导入模块的命名别名不适用于导出名称的点表示法?,javascript,reactjs,module,Javascript,Reactjs,Module,在React应用程序中,我有一个包含如下导入的文件: import * as cArrayList from './ClassArrayList' import * as mCalc1 from './moduleCalc1' export const cArrayList.ArrayList export const mCalc1.doPreCalculationSetup export const mCalc1.doTheCalculations 在同一个文件中,我有如下导出: i

在React应用程序中,我有一个包含如下导入的文件:

import * as cArrayList from './ClassArrayList'
import * as mCalc1 from './moduleCalc1'
 export const cArrayList.ArrayList
 export const mCalc1.doPreCalculationSetup
 export const mCalc1.doTheCalculations
在同一个文件中,我有如下导出:

import * as cArrayList from './ClassArrayList'
import * as mCalc1 from './moduleCalc1'
 export const cArrayList.ArrayList
 export const mCalc1.doPreCalculationSetup
 export const mCalc1.doTheCalculations
但我得到一个解析错误:标识符“cArrayList”已经声明

MDN文档在此声明中说:

import * as myModule from '/modules/my-module.js'
引用导入时,模块对象的“myModule”别名可用作一种名称空间,如下所示:

 myModule.doAllTheAmazingThings(). 
那为什么是我的错误呢

此文件中仅有61个导入行和394个导出行。该文件的全部目的是只执行一次所有必要的导入,创建一个包含项目中所有可用导出的命名空间。然后通过引用使各个导出可用于使用它们的所有其他模块,而不是每个模块执行另一个导入。这是一个避免循环引用(我认为)的实验,循环引用会导致程序在启动阶段循环

更新

在经历实现名称空间文件这一黑客想法的步骤时,我学到了一些让我觉得整个练习是不必要的东西。我认为循环应用程序实际上是一个停滞的带有gif的启动屏幕。即使已经完成的黑客程序成功了,对代码进行的许多小的修改也引起了人们的质疑。我最近的想法是尝试进行构建和运行,这是关键。该生成失败,但已识别出要更正的失败代码。然后是一系列小的代码更改

所以多亏了GIT,我才能够回到我第一次看到这个问题的时间点:一个干净的编译,但是一个停滞的启动屏幕。现在我运行了一个构建,得到了以下结果:

  Failed to compile.
  Failed to minify the code from this file: 
     ./src/calculations/moduleMoneyPlanEntry.js:53:4 
该位置的代码很简单:

function moneyPlanEntry() {
  try {
    process.env.MONEYPLAN = 'development'
    process.env.NODE_ENV = 'development'  (A)
先前标记为(A)的工作留下的线就是问题所在。删除那行,一切都好。运行构建,并使用“纱线开始”命令运行更正后的代码。因此,现在我将放弃我的名称空间攻击并继续正常操作。关键的教训是什么?每隔一段时间运行一次构建以检查潜在错误。

export const
将执行两项操作:

  • 在名为
    someIdentifier
    的模块作用域中声明一个局部变量(作为
    const
  • 将其导出为命名导出
您收到的错误消息有点误导。无论变量是否预先声明

export const someObject.someProperty
无效语法,因为
someObject.someProperty
不是有效标识符。出于类似的原因,你不能这样做

const someObject.someProperty
对于您尝试执行的操作,我将在导出时从导入的对象中解构属性,如下所示:

export const {
  doPreCalculationSetup,
  doTheCalculations
  // you can add more properties here
} =  mCalc1;
演示:


const obj={foo:'foo'};
导出常量{foo}=obj;
console.log(foo);
导出常量将执行两项操作:

  • 在名为
    someIdentifier
    的模块作用域中声明一个局部变量(作为
    const
  • 将其导出为命名导出
您收到的错误消息有点误导。无论变量是否预先声明

export const someObject.someProperty
无效语法,因为
someObject.someProperty
不是有效标识符。出于类似的原因,你不能这样做

const someObject.someProperty
对于您尝试执行的操作,我将在导出时从导入的对象中解构属性,如下所示:

export const {
  doPreCalculationSetup,
  doTheCalculations
  // you can add more properties here
} =  mCalc1;
演示:


const obj={foo:'foo'};
导出常量{foo}=obj;
console.log(foo);

@CertainPerformance已经说明了语法的所有问题

该文件的全部目的是只执行一次所有必要的导入,创建一个包含项目中所有可用导出的命名空间。然后通过引用使各个导出可用于使用它们的所有其他模块,而不是每个模块执行另一个导入

为此,您需要使用
export*from'…'语法。或从“…”导出{name as alias}以防冲突

但这听起来是一个非常糟糕的主意,与模块化相反,它将所有内容都放在一个全局名称空间中。包的各个部分之间不再有明确的依赖关系,而只是一团混乱

这是一个避免循环引用(我认为)的实验,循环引用会导致程序在启动阶段循环

循环依赖通常会导致TDZ异常,而不是无限循环

在全局模块中使用
const
声明实际上会使情况变得更糟,您确实需要使用重新导出来实际别名绑定


为了解决循环依赖性问题(不想重构,但要保持依赖性结构),您通常需要决定哪个模块应该是您的循环的入口点,以及模块应该以什么顺序执行,然后在任何模块导入列表中始终严格遵循该顺序。

@CertainPerformance已经说明了语法的所有问题

该文件的全部目的是只执行一次所有必要的导入,创建一个包含项目中所有可用导出的命名空间。然后通过引用使各个导出可用于使用它们的所有其他模块,而不是每个模块执行另一个导入

为此,您需要使用
export*from'…'语法。或从“…”导出{name as alias}以防冲突

但这听起来是一个非常糟糕的主意,与模块化相反,它将所有内容都放在一个全局名称空间中。包的各个部分之间不再有明确的依赖关系,而只是一团混乱

这是一个避免循环引用(我认为)的实验,循环引用会导致程序在启动阶段循环

循环依赖通常会导致TDZ异常,而不是无限循环

在全局模块中使用
const
声明实际上会使这些问题变得更糟,您确实需要