导入*,因为在节点中未按预期工作

问题描述 投票:0回答:1

我想使用 xlsx 模块来读取和写入 xlsx 文件,因此我通过运行

npm install xlsx
安装了 xlsx,并且我遵循了一个教程,其中提到了

    // Requiring the module 
const reader = require('xlsx') 
  
// Reading our test file 
const file = reader.readFile('./test.xlsx') 

它工作正常,但我使用的是另一个不是 commonJS 模块的模块,所以我使用了

import reader from 'xlsx';

const file = reader.readFile('./test.xlsx');

它也可以工作,但我的问题是我可以使用任何东西代替阅读器,并且仍然能够访问 readFile 方法。例如,

import anyRandomWord from 'xlsx';

const file = anyRandomWord.readFile('./test.xlsx');

现在不起作用的案例

1)官方网站是这么说的

The module also ships with xlsx.mjs for use with import:

import * as XLSX from 'xlsx/xlsx.mjs';

当我使用时

import * as XLSX from 'xlsx/xlsx.mjs';

const file = XLSX.readFile('./test.xlsx');

我收到错误

Error: Cannot access file ./test.xlsx
    at read_binary (file:///home/shivam/Others/Translate/node_modules/xlsx/xlsx.mjs:3234:8)
    at readSync (file:///home/shivam/Others/Translate/node_modules/xlsx/xlsx.mjs:23811:69)
    at Module.readFileSync (file:///home/shivam/Others/Translate/node_modules/xlsx/xlsx.mjs:23851:9)
    at file:///home/shivam/Others/Translate/translate.js:4:19
    at ModuleJob.run (node:internal/modules/esm/module_job:218:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:329:24)
    at async loadESM (node:internal/process/esm_loader:28:7)
    at async handleMainPromise (node:internal/modules/run_main:120:12)

当我使用时

import * as XLSX from 'xlsx';

const file = XLSX.readFile('./test.xlsx');

我收到错误

TypeError: XLSX.readFile is not a function
    at file:///home/shivam/Others/Translate/translate.js:4:19
    at ModuleJob.run (node:internal/modules/esm/module_job:218:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:329:24)
    at async loadESM (node:internal/process/esm_loader:28:7)
    at async handleMainPromise (node:internal/modules/run_main:120:12)

请告诉我为什么上述情况可以使用导入中的任何随机名称,而以下情况则不起作用。 我在 package.json 中添加了“type”:“module”

node.js npm xlsx
1个回答
0
投票

当我使用时

import * as XLSX from 'xlsx/xlsx.mjs';

const file = XLSX.readFile('./test.xlsx');

我收到错误

错误:无法访问文件./test.xlsx

如文档中所述,关于 xlsx/xlsx.mjs

 模块版本的使用:

mjs

版本不会自动加载原生节点模块,因此必须手动添加:

import * as XLSX from 'xlsx'; /* load 'fs' for readFile and writeFile support */ import * as fs from 'fs'; XLSX.set_fs(fs);


我可以使用任何东西代替阅读器,并且仍然能够访问 readFile 方法

...并且:

当我使用时

import * as XLSX from 'xlsx'; const file = XLSX.readFile('./test.xlsx');
我收到错误

类型错误:XLSX.readFile 不是函数

xlsx

包有一个
default导出,您可以使用任何您想要的名称导入它,正如您最初想到的那样(即import anyRandomWord from 'xlsx'
)。

但是当您导入全部(即

import * as XLSX

)时,默认导出现在是合成导入的成员,即您现在应该执行
XLSX.default.readFile()

    

© www.soinside.com 2019 - 2024. All rights reserved.