当前位置: 首页 > 知识库问答 >
问题:

命名导入和默认导入之间的webpack差异

爱繁
2023-03-14

所以,在我的webpack src中,我试着

import {Papa} from "papaparse"
export {Papa}

import Papa from "papaparse"
export {Papa}

注意第二个,导入不使用大括号。当我这样调用时,不带大括号的(默认导入?)可以工作:

import {Papa} from "papaparse-webpack-generated.js"

Papa.parse(...)

这是我用npm下载的papaparse.js:

(function(root, factory)
{
    /* globals define */
    if (typeof define === 'function' && define.amd)
    {
        // AMD. Register as an anonymous module.
        define([], factory);
    }
    else if (typeof module === 'object' && typeof exports !== 'undefined')
    {
        // Node. Does not work with strict CommonJS, but
        // only CommonJS-like environments that support module.exports,
        // like Node.
        module.exports = factory();
    }
    else
    {
        // Browser globals (root is window)
        root.Papa = factory();
    }
    // in strict mode we cannot access arguments.callee, so we need a named reference to
    // stringify the factory method for the blob worker
    // eslint-disable-next-line func-name
}(this, function moduleFactory()
{
    'use strict';
    var Papa = {};

    Papa.parse = CsvToJson;
    Papa.unparse = JsonToCsv;

    //a bunch of functions and variables here
    
    return Papa;
}));

我只是好奇这两者有什么区别?为什么我用花括号的话webpack生成的js会失败?如果我使用命名导入(花括号)使用webpack生成,那么< code>Papa.parse会给出< code>Papa is undefined

编辑:从上面的< code>papaparse.js片段中我们可以看到,对于变量< code>Papa,没有< code>export语句。我错过了什么吗?那么,我们如何判断它是命名导出还是默认导出呢?

谢谢你。

共有2个答案

顾永福
2023-03-14

这一切都归结于< code>papaparse公开/导出其模块的方式。< br >如果它正在:

const Papa = ...;
export default Papa;

您需要以这种方式导入它(导入默认导出的成员不需要大括号):

import Papa from "papaparse"
// or you can call it whatever you want
import Mama from "papaparse"

但是,如果它是命名导出,例如:

const Papa = ...;
const Mama = ...;
export { Papa, Mama };

您需要使用其名称导入它:

import { Papa } from "papaparse";
// or call it something else within your module from now on:
import { Papa as Mama } from "papaparse";
徐知
2023-03-14

在您从中导入的文件中,您会注意到 Papa 被导出为“导出默认值”。模块可以具有单个默认导出和任意数量的命名导出。

默认导出是使用不带大括号的语法导入的,并且在导入的文件中可以有任何名称(因为歧义不是通过名称来解决的,而是通过模块只能有默认导出这一事实来解决的)。

另一方面,命名导出必须由它们的特定名称引用,并且必须放在花括号内,以表示它们是命名导出。您可以使用以下语法导入多个命名导出:

import {NamedA, NamedB} from x

甚至同时导入两者:

import DefaultExport, {NamedA, NamedB} from x

在这里进一步阅读: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import

 类似资料:
  • 问题内容: 我很惊讶地发现 和 对全球成员产生了不同的影响。我想确认我的实验是正确的行为。 在第一个示例中,更改foo模块中的成员将反映在所有导入foo的代码中。但是,在以后的情况下更改该成员似乎仅影响导入该成员的文件。换句话说,使用后一种方法将为每个导入文件提供其自己的foo成员副本。 我想要的行为是可以从所有文件访问foo.x,可以从所有文件更改它,并在所有文件中反映该更改(如果愿意,则为真正

  • 我已经看到了从ES6中的另一个模块导入代码的以下两种变体: 和 其中是在文件中定义的ES6类 Module.js 这两种导入语句有什么区别?

  • 这是一个非常基本的问题,有一个非常广泛的答案,由@Mark Roddy编写使用导入模块或从模块导入? 根据这个答案,每种方法都有利弊,但结果是相同的,两者都有效。 这样做: 或 应该有用。 我的问题: 考虑这个例子: 其中: 以及: 它给出了以下输出: 所以我很困惑。两者都应该起作用。为什么Python会为第一种方法生成异常?

  • 我正在使用VSCode并尝试将项目中跨多个文件的导入写入方式更正为更高性能的格式——VSCode是否具有促进这一点的功能?它可以通过内置的查找和替换来完成吗?或者其他一些VSCode功能能够做到这一点吗? 我得到的导入看起来是这样的(<code>substance ux</code>是真实模块名的模糊版本,因为我不需要特定于模块的答案): 或者也许: 我需要将其转换为这种样式,以匹配我们项目中其他

  • 问题内容: 两者之间的性能复杂度是多少 和 PS。 我知道第一个文件将包含每个文件,第二个文件将仅包含选定的类文件。 问题答案: 在运行时0。 两者都生成相同的字节码

  • 从ES6JavaScript模块导入和命名资源的正确语法是什么? 例子: 如何一次导入? 它不是什么时候我应该使用花括号进行ES6导入的重复?,它更具体,要求一个单一的用例,而不是一篇文章。

  • 问题内容: 在Python中,我不太清楚以下两行代码之间的区别: 要么 他们不是都只是从模块X导入所有内容吗?有什么不同? 问题答案: 之后,你可以参考的东西一样。之后,您可以像一样直接引用事物。因为第二种形式将名称直接导入到本地名称空间,所以如果您从许多模块中导入内容,则可能会产生冲突。因此,不鼓励使用。 您也可以执行,仅将导入到本地名称空间,而不导入中的所有内容。这样做会更好,因为如果您列出了

  • 模块“Transformer”解析为非模块实体,不能使用此构造导入。 如何导入类?其实我只是想利用那堂课。我不希望指令在我的代码中产生附带效应。我只想用它:'(