无法从非 EcmaScript 模块导入命名的导出 XXXX(只有默认导出可用)

Posted

技术标签:

【中文标题】无法从非 EcmaScript 模块导入命名的导出 XXXX(只有默认导出可用)【英文标题】:Can't import the named export XXXX from non EcmaScript module (only default export is available) 【发布时间】:2021-11-19 09:25:02 【问题描述】:

我有一个客户端-服务器设置,其中客户端(create-react-app)在 localhost:3000 上运行,服务器是一个构建在节点上的快速服务器,我正在尝试构建 graphql 模式解析器设置。

我可以在服务器上导入 .graphql 文件,但是在客户端,我使用的是 graphql-tools 的设置。

当我尝试在前端构建架构解析器时,我正在导入

import  GraphQLFileLoader  from '@graphql-tools/graphql-file-loader';
import  addResolversToSchema  from '@graphql-tools/schema';
import  loadSchema  from '@graphql-tools/load';

...导致此错误: ./node_modules/@graphql-tools/graphql-file-loader/index.mjs 无法从非 EcmaScript 模块导入命名导出“AggregateError”(只有默认导出可用)

经过研究,我发现这是一个与 webpack 相关的问题。

这个问题有解决办法吗?

【问题讨论】:

【参考方案1】:

试试这个,希望对你有帮助

mkdir webpack-test
cd webpack-test
npm init -y
npm install --save graphql webpack webpack-cli
./node_modules/.bin/webpack-cli index.js

【讨论】:

试过了,还是不行,感谢帮助【参考方案2】:

我在每个 @graphql-tools 子文件夹(merge、mock 和 schema)中手动将 index.mjs 重命名为 index.mjs_old,并且成功了。

【讨论】:

重命名,没用,谢谢 我可以看到您收到错误主要是因为 @graphql-tools/graphql-file-loader 尝试将 ./node_modules/@graphql-tools/graphql-file-loader/ 中的 index.mjs 重命名为 index.mjs_old。 PS。只需确保在同一位置有另一个名为 index.js 的文件 在包含有问题文件的包中,我正试图开始工作,@matheo/datepicker,旁边没有“正常”模块 - 我猜这就是它对你有用的原因,因为你的拥有它们。【参考方案3】:

这是 glahql 库的另一个示例

module.exports = 
    chainWebpack: config => 
        // ...other chains
        config.module // fixes https://github.com/graphql/graphql-js/issues/1272
            .rule('mjs$')
            .test(/\.mjs$/)
            .include
                .add(/node_modules/)
                .end()
            .type('javascript/auto');
    ,
    configureWebpack: 
        resolve: 
            // .mjs needed for https://github.com/graphql/graphql-js/issues/1272
            extensions: ['*', '.mjs', '.js', '.vue', '.json']
        
    

【讨论】:

这两种解决方案我都试过了,不幸的是两者都有同样的错误【参考方案4】:

解决方案是确保在项目目录的根目录中有一个 webpack.config.js 文件,如下所示:

const config = 
  mode: 'production', // "production" | "development" | "none"
  resolve: 
    extensions: ['*', '.mjs', '.js', '.json']
  ,
  module: 
    rules: [
      
        test: /\.mjs$/,
        include: /node_modules/,
        type: 'javascript/auto'
      
    ]
  


module.exports = config

你也可以看看https://github.com/vanruesc/postprocessing

【讨论】:

我添加了文件,错误依旧

以上是关于无法从非 EcmaScript 模块导入命名的导出 XXXX(只有默认导出可用)的主要内容,如果未能解决你的问题,请参考以下文章

./node_modules/ngx-window-token/fesm2015/ngx-window-token.mjs 中的错误。无法从非 EcmaScript 模块导入命名导出“Injectio

将 CommonJS 默认导出导入为命名导出/无法加载 ES 模块

如何正确配置实验性 ECMAScript 模块,以便在 Node.js 中使用导入/导出

为啥导出/导入默认 ES 模块属性比命名模块属性更快?

导入 ECMAScript 6 时出现“未捕获的语法错误:无法在模块外使用 import 语句”

import()提供了动态加载 ECMAScript 模块的功能