ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

nodejs require/import导包报错以及解决方法

2022-09-12 03:02:16  阅读:228  来源: 互联网

标签:const nodejs require module js step 报错 import


背景

最近发现一本nodejs的小册,在学习其中的代码时,发现里面用到了chalk-animation这个库,在install好这个库后,使用require()导入时报错

Error [ERR_REQUIRE_ESM]: require() of ES Module E:\...\code\node_modules\chalk-animation\index.js from E:\...\code\案例一.js not supported.
Instead change the require of index.js in E:\...\code\案例一.js to a dynamic import() which is available in all CommonJS modules.

由于这本小册写于多年前,现在这个库最新版已经变成了ESModule导出了,看到报错信息,貌似已经支持了全部的CommonJS模块使用import导入,果断改成import导入方式。这时候再来运行代码,控制台又爆出如下错误:

import chalkWorker from 'chalk-animation'
^^^^^^

SyntaxError: Cannot use import statement outside a module

这是由于没有声明包类型导致的

解决方案

打开package.json,在其中声明包类型为module,如下所示

{
  "devDependencies": {
    "chalk-animation": "^2.0.3"
  },
  "type": "module"
}

type还可以设置为commomjs,这个是默认的(V18.4)。

意外事故

有这么两个文件

//step.js
const pad = '.'
exports.step = (t)=>`|${pad.repeat(t)}>>`
//race.js
const { step } = require("./step.js")
const steps = step(20)
module.exports = { steps }

在设置为module后,原先js文件中module.exports的方式就不支持了。会报如下错误

const { step } = require("./step.js")
                 ^

ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension 
and 'E:\...\code\package.json' contains "type": "module".
To treat it as a CommonJS script, rename it to use the '.cjs' file extension.

根据报错信息提示,我们可以使用两种方法来修改代码。

  • 使用import的方式来代替require
//导入的改变
// const { step } = require("./step.js")
import { step } from "./step.js"

//导出也要改变
//exports.step = (t)=>`|${pad.repeat(t)}>>`
export function step(t){ return `|${pad.repeat(t)}>>`}
  • 把文件拓展名改为.cjs,这样它会被当作commonJs来对待

标签:const,nodejs,require,module,js,step,报错,import
来源: https://www.cnblogs.com/sq800/p/16685289.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有