react框架中无构建模式直接使用es6组件

news/2024/7/10 23:12:11 标签: react.js, es6, 前端, esm

react框架,看到的总是使用es5,通过webpack编译构建。react官方,直到现在的v18.1.0版本中,只有cjs和umd版本,都没有esmes6)版本,看起来是对es6的不认可?

但是,大家写react组件都是按es6语法在写,最后搞了一大堆webpack/babel来转成es5运行,啰里啰嗦的,特别是搞出了import加载css,import加载图片的语法,不好理解。为何不直接使用es6原生模式直接运行呢?

我比较喜欢“浏览器原生开发”,不想如俄罗套娃一样,一层层套下去,搞了很多半生不熟的工具(react-app在node_modules下搞出的921个组件,是很唬人的),最后出问题了还不知道哪里找。

相比较而言,vue 3.3.4版本就有cjs和esm版本,使用vue的框架就可以使用es6

那是否react框架真的没有办法使用es6运行呢?那倒不是,只是麻烦些,方法如下。

(1)react和react-dom封装成es6

有些第三方组件,引用react是隐式从window.React来,有的是显示import。

import React from 'react';

class YJFoilTopLeft extends React.Component {

不太可能去要求人家全部改掉。只能把react封装成一个esm版本的组件:

react@foil.mjs

/**
 * react v18.1.0,官方没有提供es6版本,这里把es5版本包装成es6版本。
 */
let React = window.yjRequire('react@raw');
let { Children, Component, Fragment, Profiler, PureComponent, StrictMode,
  Suspense, __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, cloneElement,
  createContext, createElement, createFactory, createRef, forwardRef,
  isValidElement, lazy, memo, startTransition, unstable_act, useCallback,
  useContext, useDebugValue, useDeferredValue, useEffect, useId, useImperativeHandle,
  useInsertionEffect, useLayoutEffect, useMemo, useReducer, useRef, useState,
  useSyncExternalStore, useTransition, version } = React;
export {
  Children, Component, Fragment, Profiler, PureComponent, StrictMode,
  Suspense, __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, cloneElement,
  createContext, createElement, createFactory, createRef, forwardRef,
  isValidElement, lazy, memo, startTransition, unstable_act, useCallback,
  useContext, useDebugValue, useDeferredValue, useEffect, useId, useImperativeHandle,
  useInsertionEffect, useLayoutEffect, useMemo, useReducer, useRef, useState,
  useSyncExternalStore, useTransition, version
}
export default React;

如果你是用<script src='/react/umd/react.development.js'>加载React到window上的,那上面的let React = window.yjRequire('react@raw');可以改为:let React = window.React;

react-dom也类似:

react-dom@foil.mjs

/**
 * react-dom v18.1.0,官方没有提供es6版本,这里把es5版本包装成es6版本。
 */
let ReactDOM = window.yjRequire('react-dom@raw');
let { __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, createPortal, createRoot,
  findDOMNode, flushSync, hydrate, hydrateRoot, render, unmountComponentAtNode,
  unstable_batchedUpdates, unstable_renderSubtreeIntoContainer, version } = ReactDOM;
export {
  __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, createPortal, createRoot,
  findDOMNode, flushSync, hydrate, hydrateRoot, render, unmountComponentAtNode,
  unstable_batchedUpdates, unstable_renderSubtreeIntoContainer, version
}
export default ReactDOM;

浏览器中的importMap这样写:

{
  'react@raw':"/react/umd/react.development.js",
  'react-dom@raw':"/react-dom/umd/react-dom.development.js",
         
  'react':'/spa/react/root/src/wrapper/react@foil.mjs',
  'react-dom':'/spa/react/root/src/wrapper/react-dom@foil.mjs'
}

(2)遇到其它没有esm版本的第三方组件,如法炮制。

如:devextreme-react用到的prop-types,也是没有esm版本:

prop-types@foil.mjs

/**
 * prop-types v15.8.1,官方没有提供es6版本,这里把es5版本包装成es6版本。
 */
let PropTypes = window.yjRequire('prop-types@raw');
let { array, bigint, bool, func, number, object, string, symbol,
  any, arrayOf, element, elementType, instanceOf, node, objectOf,
  oneOf, oneOfType, shape, exact, checkPropTypes, resetWarningCache} = PropTypes;
export {
  array, bigint, bool, func, number, object, string, symbol,
  any, arrayOf, element, elementType, instanceOf, node, objectOf,
  oneOf, oneOfType, shape, exact, checkPropTypes, resetWarningCache, PropTypes
}
export default PropTypes;

在浏览器importMap中加上映射:

{
  "prop-types@raw":"/devextreme-react/node_modules/prop-types/prop-types.js",
  "prop-types":"/spa/react/root/src/wrapper/prop-types@foil.mjs",
}

rc-easyui 1.2.9版本也没有esm版本,你自己封装试试吧。


http://www.niftyadmin.cn/n/5433622.html

相关文章

Android分区存储到底是怎么回事

文章目录 一、Android存储结构二、什么是分区存储&#xff1f;三、私有目录和公有目录三、存储权限和分区存储有什么关系&#xff1f;四、我们应该该怎么做适配&#xff1f;4.1、利用File进行操作4.2、使用MediaStore操作数据库 一、Android存储结构 Android存储分为内部存储和…

Python 查找并高亮PDF中的指定文本

在处理大量PDF文档时&#xff0c;有时我们需要快速找到特定的文本信息。本文将提供以下三个Python示例来帮助你在PDF文件中快速查找并高亮指定的文本。 查找并高亮PDF中所有的指定文本查找并高亮PDF某个区域内的指定文本使用正则表达式搜索指定文本并高亮 本文将用到国产第三方…

Docker 安装 LogStash

关于LogStash Logstash&#xff0c;作为Elastic Stack家族中的核心成员之一&#xff0c;是一个功能强大的开源数据收集引擎。它专长于从各种来源动态地获取、解析、转换和丰富数据&#xff0c;并将这些结构化或非结构化的数据高效地传输到诸如Elasticsearch等存储系统中进行集…

Lua中文语言编程源码-第三节,更改lualib.h Lua标准库, 使Lua支持中文关键词(与所有的基础库相关)

源码已经更新在CSDN的码库里&#xff1a; git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的lualib.h&#xff0c;是Lua的标准库模块。 Lua标准库一共有有个10个库&#xff0c;base, 基本用不着改&#xff0c;所以没加中文名称。 函数声明宏名英文库名中文库…

LabVIEW湍流等离子体束热效率优化

LabVIEW湍流等离子体束热效率优化 利用LabVIEW虚拟仪器技术&#xff0c;对湍流等离子体束的热效率进行了实时监测与优化&#xff0c;提高其在材料处理领域的应用效率和精度。通过双进气湍流等离子体发生器&#xff0c;实现了在不同工作参数下对热效率的实时在线监测&#xff0…

Leet code 179 最大数

解题思路 贪心算法 贪心算法就是走一步看一步 每一步都取当前位置的最优解 这题我们该如何贪呢&#xff1f; 我们先把int数组转换为string数组 以示例2为例 3 30 34 5 9 排序哪个在前哪个在后&#xff1f; 3 30 &#xff08;330&#xff09;> 30 3 &#xff08;30…

【Spring Boot】创建你的第一个 Spring Boot 应用

创建你的第一个 Spring Boot 应用 1.环境配置2.步骤详解3.项目结构分析3.1 入口类 DemoApplication3.2 控制器 PathVariableController3.3 控制器 BasicController3.4 模型 User 4.运行 Spring Boot 目前已经成为了 Java 开发领域的框架范式。本篇博客&#xff0c;我将带领大家…

Python | 机器学习中的模型验证曲线

模型验证是数据科学项目的重要组成部分&#xff0c;因为我们希望选择一个不仅在训练数据集上表现良好&#xff0c;而且在测试数据集上具有良好准确性的模型。模型验证帮助我们找到一个具有低方差的模型。 什么是验证曲线 验证曲线是一种重要的诊断工具&#xff0c;它显示了机…