错误:不应导入命名的导出“版本”(导入为“版本”)

Muh*_*mal 18 webpack webpack-5

我有一个弹出的 create-react-app 项目。将其更新到 webpack 5 后,我收到此错误。它在 webpack v4.41.5 上运行良好

node v10.23.0 操作系统:MacOS Catalina 10.15.7

错误:不应从默认导出模块导入命名的导出“版本”(导入为“版本”)(仅默认导出很快可用)

我正在使用以下 webpack 配置:

{ mode: 'production',
  bail: true,
  devtool: 'source-map',
  entry:
   [ '/Users/Homeoffice/Documents/toolbox-frontend-clone2/src/index.js' ],
  output:
   { path: '/Users/Homeoffice/Documents/toolbox-frontend-clone2/build',
     pathinfo: false,
     filename: 'static/js/[name].[contenthash:8].js',
     chunkFilename: 'static/js/[name].[contenthash:8].chunk.js',
     publicPath: '/',
     devtoolModuleFilenameTemplate: [Function],
     globalObject: 'this' },
  optimization:
   { minimize: false,
     minimizer: [ [TerserPlugin], [OptimizeCssAssetsWebpackPlugin] ],
     splitChunks: { chunks: 'all', name: false },
     runtimeChunk: { name: [Function: name] } },
  resolve:
   { modules:
      [ 'node_modules',
        '/Users/Homeoffice/Documents/toolbox-frontend-clone2/node_modules' ],
     extensions:
      [ '.web.mjs', '.mjs', '.web.js', '.js', '.json', '.web.jsx', '.jsx' ],
     alias: { 'react-native': 'react-native-web' },
     plugins: [ [Object], [ModuleScopePlugin] ] },
  resolveLoader: { plugins: [ [Object] ] },
  module: { strictExportPresence: true, rules: [ [Object] ] },
  plugins:
   [ HtmlWebpackPlugin { userOptions: [Object], version: 5 },
     InlineChunkHtmlPlugin { htmlWebpackPlugin: [Function], tests: [Array] },
     InterpolateHtmlPlugin { htmlWebpackPlugin: [Function], replacements: [Object] },
     ModuleNotFoundPlugin {
       appPath: '/Users/Homeoffice/Documents/toolbox-frontend-clone2',
       yarnLockFile: undefined,
       useYarnCommand: [Function: bound useYarnCommand],
       getRelativePath: [Function: bound getRelativePath],
       prettierError: [Function: bound prettierError] },
     DefinePlugin { definitions: [Object] },
     MiniCssExtractPlugin { options: [Object], runtimeOptions: [Object] },
     ManifestPlugin { opts: [Object] },
     IgnorePlugin {
       options: /^\.\/locale$/,
       checkIgnore: [Function: bound checkIgnore] },
     GenerateSW { config: [Object] },
     [Function] ],
  node: false,
  performance: false }
Run Code Online (Sandbox Code Playgroud)

Spl*_*tar 39

更改以下内容

import { version } from '../../package.json';
Run Code Online (Sandbox Code Playgroud)


import packageInfo from '../../package.json';
Run Code Online (Sandbox Code Playgroud)

然后从类似的东西更改您的访问权限

  version,
Run Code Online (Sandbox Code Playgroud)

或者

  version: version,
Run Code Online (Sandbox Code Playgroud)

version: packageInfo.version,
Run Code Online (Sandbox Code Playgroud)

  • 这并不能解决问题,您现在将收到此警告。`不应该从默认导出模块导入命名导出'版本'(作为'packageJson'导入)(很快只有默认导出可用)` (17认同)
  • 但这不会带来安全风险并将整个package.json暴露给客户端吗? (13认同)
  • @Splaktar,即使“package.json”中没有秘密,我也发现这个**极其不安全**。大多数开发人员和维护人员,即使有经验,也不会将“package.json”视为公共领域的内容。对于像这样“隐藏”在代码库中的实现来说,脚上的一枪真的很痛苦。特别是因为这个错误现在出现在客户端技术 Angular 12 中。因此,恕我直言,**清晰可见的 HEADS-UP** 是合适的。 (9认同)
  • 同意@JeyDWork,这个解决方案应该被标记为潜在的安全风险。如果你的 package.json 现在不包含机密数据,谁能保证其他开发人员多年后不会在不知道它已暴露在生产环境的情况下将其放在那里?即使没有任何秘密,通常情况下,企业也不希望将“package.json”中有关其“依赖项”和“devDependency”的信息暴露给每个人 - 这使得更容易发现漏洞并渗透应用程序。 (9认同)
  • 将导入语句更新为 `import packageInfo from '../../package.json';` @Breakpoint25 (6认同)
  • 从'../../package.json'导入*作为packageInfo;版本:packageInfo.version, (2认同)
  • 关于如何安全地执行此操作的后续问题:/sf/ask/4920926391/ (2认同)

Had*_*umi 32

我通过以下方法解决了我的问题:

    import packageInfo from './package.json';
    
    
    version = packageInfo.version;
Run Code Online (Sandbox Code Playgroud)

  • 这与 `"resolveJsonModule": true, "allowSyntheticDefaultImports": true` 一起使用 (6认同)

小智 17

您还应该添加 "allowSyntheticDefaultImports": true, 到 tsconfig.json 中的 compileroptions

  • @NuryagdyMustapayev 这对我有用:`import * as packageInfo from '../../package.json';`并重命名变量而不是直接访问`version``someName = packageInfo` (3认同)

小智 16

怎么样const appVersion = require('./package.json').version;

使用它,我们实际上并没有传送整个 package.json,而只是从中引入版本。

  • 我在 Angular 项目的单元测试代码中导入了 JSON 文件。将 Angular 版本升级到 v12 后,我开始收到此错误。在我的测试代码中,我已经按照接受的答案中所述的正确方式导入,但我收到了此错误。更改为“require”对我来说已经解决了。谢谢。 (2认同)

Yuv*_*til 9

对于最新版本的create react app,以下语法有效:

import rData from './registration-form.json';
Run Code Online (Sandbox Code Playgroud)


小智 5

这就是我解决问题的方法(其余答案对我不起作用)。从这里找到的解决方案https://www.angularfix.com/2021/10/error-should-not-import-named-export.html

步骤1

将以下内容添加到您的ts.config文件中

"resolveJsonModule": true,
"esModuleInterop": true,
Run Code Online (Sandbox Code Playgroud)

(将它们添加到“compileroptions”块的末尾)

  "compilerOptions": {
    // 
    "resolveJsonModule": true,
    "allowSyntheticDefaultImports": true
  },
Run Code Online (Sandbox Code Playgroud)

第2步

使用以下语法导入所需的文件。当然将文件名更改为您的文件名。

import {default as data} from '../../package.json';
Run Code Online (Sandbox Code Playgroud)

步骤3

您现在可以通过此语法访问变量

data.variable_name
Run Code Online (Sandbox Code Playgroud)

这基本上就是我的文件的样子,它编译成功

import {default as authInfo} from '../../auth_config.json';

export const environment = {
  // 
  domain: authInfo.domain,
  clientId: authInfo.clientId
};
Run Code Online (Sandbox Code Playgroud)