umi项目中使用html-loader引入html文件报错`this.getOptions is not a function`

2023-11-16

背景

在umi项目中引用html文件,使用html-loader解析html文件(,)

 "dumi": "^1.1.0" 
 "html-loader": "^3.1.0"

环境信息

tiands@tiandsdeMacBook-Pro demo-doc % node -v
v14.18.1
tiands@tiandsdeMacBook-Pro demo-doc % npm -v
6.14.15

问题描述

通过umi配置项chainWebpack添加了html-loader,运行项目的终端报错TypeError: this.getOptions is not a function

umirc.ts配置

import { defineConfig } from 'dumi';

export default defineConfig({
  title: 'demo文档',
  ...
  chainWebpack(config){
    config.module
      .rule('html-loader')
      .test(/\.html$/)
        .exclude
        .end()
      .use('html-loader')
        .loader('html-loader');      
  },
 ...
});

react组件代码

import React from 'react';
import styles from './EchartsMap.less';
import data from './中国地图.html';

export interface EchartsMapProps extends React.HTMLAttributes<HTMLDivElement> {}

const EchartsMap = (props: EchartsMapProps) => {
  const { className = '', ...otherProps } = props;
  return (
    <div className={`${styles.root} ${className}`} {...otherProps}>
  <iframe
        title="resg"
        srcDoc={data}
        style={{ width: '100%', border: '0px', height: '600px' }}
        sandbox="allow-same-origin allow-scripts allow-popups allow-forms"
        scrolling="auto"
      />
    </div>
  );
};

export default EchartsMap;

报错信息

 ERROR  Failed to compile with 1 errors                                                                            下午4:14:24

 error  in ./src/PureHtml/ components/EchartsMap/中国地图.html

Module build failed (from ./node_modules/html-loader/dist/cjs.js):
TypeError: this.getOptions is not a function
    at Object.loader (/Users/tiands/Desktop/github/demo-doc/node_modules/html-loader/dist/index.js:23:27)

 @ ./src/PureHtml/ components/EchartsMap/EchartsMap.tsx 6:0-31 24:12-16
 @ ./src/.umi/dumi/demos/index.ts
 @ ./src/.umi/dumi/layout.tsx

解决流程

  1. 大致看下报错,一个方法没找到,没什么头绪,
  2. 搜索“umi htm-loderl this.getOptions is not a function”,找到一片文章TypeError: this.getOptions is not a function(html-loader),文章说是html-loader版本太高,报错很一致,但是他是vue项目
  3. 搜索“html-loader this.getOptions is not a function”,找到一篇TypeError: this.getOptions is not a function #378 - GitHub的webpack相关文章,里面说html-loader@2.0不支持webpack5

原因分析

umi项目默认使用webpack4(umi-文档)
在这里插入图片描述

html-loader从2.0开始就仅支持webpack5(html-loader/releases)
在这里插入图片描述


解决方案

方案一:降级html-loader

先移除之前的版本

npm uninstall html-loader

安装较稳定版本

npm i html-loader@1.3.0 --save

方案二:使用webpack5编译项目

修改umirc.ts配置项webpack5

import { defineConfig } from 'dumi';

export default defineConfig({
  title: 'demo文档',
  ...
  chainWebpack(config){
    config.module
      .rule('html-loader')
      .test(/\.html$/)
        .exclude
        .end()
      .use('html-loader')
        .loader('html-loader');      
  },
  webpack5:{},
  ...
});

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

umi项目中使用html-loader引入html文件报错`this.getOptions is not a function` 的相关文章

  • 如何将毫秒转换为可读的日期?

    下列 new Date 1324339200000 toUTCString Outputs Tue 20 Dec 2011 00 00 00 GMT 我需要它返回Dec 20 除了我可以使用的更好的方法之外toUTCString 我正在寻找
  • 如何使用 javascript/ASP.NET/CSS 旋转和淡入淡出背景图像

    我需要随机淡入淡出背景图像 这将是一个定时函数 例如每 5 秒一次 我需要使用 ASP NET Javascript CSS 或全部三者来完成此操作 请大家帮帮我 谢谢 Cycle 一个 jQuery 插件 是一个非常灵活的图像旋转解决方案
  • 使用他们的 API 创建一个基本的 MailChimp 注册表单

    我是 MailChimp 的新手 需要一些帮助 通过他们的基本时事通讯注册表单 您只需将一些预先打包的 HTML 嵌入到您的页面中即可 然而 这样做的问题是 单击 提交 会重定向到 MailChimp 页面 我不想重定向到 MailChim
  • 在多个 angular.js 应用程序之间共享单个服务

    我正在构建一个电子商务网站 基于 shopify 并且使用多个小型 angularjs 应用程序来处理诸如快速购物车 愿望清单 过滤产品和其他一些较小项目之类的事情 我最初使用了一个大型应用程序 具有路由和所有内容 但当我没有完整的 RES
  • 在 angularJS 中覆盖模块值/常量的最佳方法

    我用 angularJS 编写了一个模块 封装了所有后端通信 为了获得更大的灵活性 我将 api 前缀作为模块上的常量值 可能是值 因为我没有在配置阶段使用它 所以像 angular module myapp data constant a
  • .then(functionReference) 和 .then(function(value){return functionReference(value)}) 之间有区别吗?

    给定一个用于处理的命名函数Promise value function handlePromise data do stuff with data return data a 传递命名函数handlePromise作为参考 then pro
  • setTimeout() 的问题

    这是我的代码 我想要它做的是写 0 等待一秒 写 1 等待一秒 写 2 等待一秒 等等 而是写 5 5 5 5 5 for i 0 i lt 5 i setTimeout document write i 1000 http jsfiddl
  • 使用 ngx-translate 时更改 URL

    当有人使用 ngx translate 单击所选语言时 我尝试更改 URL 我想我应该通过订阅语言更改事件然后修改当前的 url 以反映所选的语言来做到这一点 因为我是新手 所以我不确定是否需要服务来做到这一点 或者可能是另一种解决方法 我
  • 如何在 Vue.js 2 中使用事件总线通过自定义事件传递数据

    我在用着Vue js 2 5 x 在我的玩具项目中 我实现了一个事件总线 类似于所示的here https alligator io vuejs global event bus 事件总线在 Vue 原型中全局注册为 eventBus 然后
  • 将 DIV 堆叠在一起?

    是否可以堆叠多个 DIV 例如 div div div div div div div div div div 那么所有这些内部 DIV 都具有相同的 X 和 Y 位置吗 默认情况下 它们都在彼此下方 将 Y 位置增加了上一个 DIV 的高
  • 如何在 html 画布上使文本适合精确的宽度?

    如何在 html5 画布上将单行文本字符串调整为精确的宽度 到目前为止我尝试过的是以初始字体大小编写文本 测量文本的宽度measureText my text width 然后根据我想要的文本宽度和实际文本宽度之间的比例计算新的字体大小 它
  • c3js数据标签的位置

    有没有可能的方法来更改数据上方标签的位置c3条形图 在官方文档中 很好地解释了如何通过操作 y 和 x 整数来更改 x 和 y 测量轴上标签的位置 但我没有找到任何数据标签 我试图用简单的方式指出它d3其上c3是基于但是console lo
  • 如何在没有查询参数的情况下重新加载页面?

    假设我想重新加载www domain com abc num 4 但我想重新加载www domain com abcONLY 问号后没有所有内容 window location window location href split 0
  • Boolean("false") 返回 true..还有其他选择吗?

    我正在使用 jquery 将 true 和 false 字符串写入 data html 属性 但是 当我将 false 写入其中一个属性 然后检查它是否为 false 时 它 会返回 true 我还在网上读到它应该这样做 这真的毫无意义 有
  • 保留以下文本的标题

    我正在使用 css 列计数功能将我的部分分成两列 在一个页面上 我在第一列的底部有一个 h3 标题 在下一列的顶部有一个 p 段落 我想保留该段落的前几句话的标题 我可以将其与整个段落一起包装在使用 inline block 样式的 div
  • 检测浏览器是否支持 contentEditable?

    There s 这个问题 https stackoverflow com questions 3497942 browser detect contenteditable features 但发布的解决方案是浏览器嗅探 我试图避免这种情况
  • 插入四个空格而不是制表符

    我试图在按下 Tab 键时插入四个空格 我正在使用以下代码 请参阅spaces t 但是当我将其切换到spaces 当我按 Tab 时只插入一个空格 我还尝试了 function textarea keydown function e va
  • 使用来自Processing-JS的JSON

    我想使用编写一个应用程序处理 JS http processingjs org 并且我希望能够使用服务器端数据加载它 我还没有编写服务器端 所以我可以使用任何东西 但似乎明显的 AJAX 事情是使用 JSON 将数据上传到页面中 如何从我的
  • 为什么转换 new.Date() .toISOString() 会改变时间?

    我正在以两种不同的格式在数据库中插入日期 这是作为日期时间插入 var mydate mydate new Date document getElementById clockinhour value mydate toISOString
  • 使用 document.getElementsByName() 不起作用?

    第二个警报命令的代码按预期工作 显示元素 to 的值 但第一个警报命令不起作用 它应该做同样的事情 这是为什么

随机推荐