Javascript 使用导入模块的命名别名不适用于导出名称的点表示法?
在React应用程序中,我有一个包含如下导入的文件: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
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
声明实际上会使这些问题变得更糟,您确实需要