浏览器require加载devextreme-react组件

这篇具有很好参考价值的文章主要介绍了浏览器require加载devextreme-react组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

十几年前使用了devexpress公司的delphi元件,功能很强。它们的html元件devextreme,功能表现类似,也行强。

devextreme和devextreme-react,我使用的是23.2.3版本。

官方推荐的用法,都是要经过build:

npx devextreme-cli new react-app app-name
cd app-name
npm run start

经过约12秒的build,出来的html中有一个bundle.js,大小为12.5M。

它的模式是MPA,用babel把react组件转换成了js代码。

如果我要做SPA,不要每次都build,如何做?

devextreme和devextrem-react提供了cjs(es5)和esm(es6)两套代码,但是react本身没有esm的代码版本,如果devextreme使用esm版本,还是要经过babel转成es5来使用。

我们用es5的cjs版本吧。

(1)首先要在浏览器实现一个require函数,我是用breq - npm来改的。

(2)后台如何提供模组加载,我用nodejs实现静态文件。

会遇到几个问题:

(1)引用的组件不是相对路径,不是.、..、/打头的。

如:

import {TabPanel,Item as TabPanelItem} from 'devextreme-react/tab-panel.js';
import {locale,loadMessages} from 'devextreme/localization.js';

require需要仿照import实现一个importMap,建立文件映射表,如:

{
  "devextreme-react/tab-panel.js":'/devextreme-react/cjs/tab-panel.js',
  "devextreme/localization.js":'/devextreme-react/cjs/localization.js',
}

但是devextreme组件文件有500个以上,用绝对路径加载的也有好几十个,如果一个个加到importMap中也挺累的。可以实现一个目录映射来一网打尽,如:

"devextreme/":"/devextreme/cjs/",

实现后,发现其实import的importMap也支持这样的目录映射,好多文章没讲。

(2)引用的组件没有扩展名,如:

import {TabPanel,Item as TabPanelItem} from 'devextreme-react/tab-panel';
import {locale,loadMessages} from 'devextreme/localization';

var _file_saver = require("./exporter/file_saver");
var _image_creator = require("./exporter/image_creator");
var _svg_creator = require("./exporter/svg_creator");
var _type = require("./core/utils/type");
var _deferred = require("./core/utils/deferred");
var _pdf_creator = require("./exporter/pdf_creator");

这需要后台的static函数支持这种检查,看看加上.js、.cjs扩展名是否存在此文件。

(3)引用的组件是个目录。

后台的static要尝试查找此目录下的index.js文件,如果没有index.js,看看有没有package.json文件,解析使用其中的main属性指向的文件。

组件是目录时,还导致一个额外的问题,浏览器发起者不知道这是个目录,以为是个文件,所以接下来再加载相对路径的组件时,就会导致路径错误,如:

let require('a/b/c'),实际是加载了/a/b/c/index.js,浏览器以为是来自/a/b/c.js,当前目录是/a/b,实际当前目录应该是/a/b/c,如果index.js中有一句require('../d.js'),浏览器就会解析为require('/a/d.js'),导致找不到文件,实际应该是a/b/d.js。

有两种方法解决:

a.后台的实际文件,返回到res的headers的location中,参考重定向的规范:http响应状态码(Header常见属性 — Location属性)_http location-CSDN博客。如:res.set('location',req.url);前台获得后,按location值设定当前目录。

b.在importMap中特殊配置一个映射,如:“a/b/c”:"/a/b/c/index.js"

(4)循环引用。就是一个引用文件还没解析执行完,又被其它文件引用到了。devextreme-react中发现2处,引用栈如下:

0: "/devextreme-react/cjs/core/component-base"
1: "/devextreme-react/cjs/core/template-manager"
2: "/devextreme-react/cjs/core/template-wrapper"
3: "/devextreme-react/cjs/core/component-base"
0: "/devextreme-react/cjs/core/component-base"
1: "/devextreme-react/cjs/core/template-manager"
2: "/devextreme-react/cjs/core/component-base"

devextreme中发现1处:

0: "/devextreme/cjs/ui/popup"
1: "/devextreme/cjs/ui/popup/ui.popup.full"
2: "/devextreme/cjs/ui/toolbar"
3: "/devextreme/cjs/ui/toolbar/ui.toolbar"
4: "/devextreme/cjs/ui/toolbar/strategy/toolbar.singleline"
5: "/devextreme/cjs/ui/toolbar/internal/ui.toolbar.menu"
6: "/devextreme/cjs/ui/popup"

为了避免循环引用的死循环栈溢出,require的cache需要在eval前就加入,不能在之后加入。

循环引用实际没有导致devextreme元件出bug,因为export的是一个object,加上js代码执行时的”Hoisting"(变量和函数提升),不马上使用require结果时没有问题。

如:\devextreme-react\cjs\core\template-wrapper.js

var component_base_1 = require("./component-base");
...
var TemplateWrapperComponent = function (_a) {
  component_base_1 = require("./component-base");//add by mustapha
  ...
}

第1行代码不能删除,否则可能导致其它组件没有加载进来。TemplateWrapperComponent 中的那行其实也不用加,加了看起来更保险。

(5)require函数返回的module.exports如何处理default?

不要做任何处理,直接返回module.exports。

对于:

import {A} from '/x.js';
A.name='shanghai';
import B from '/y.js';
B.name='chongqing';
export default {A,B};
export {A,B};

banel转换后,首先会把module.__esModule设置为true,对import B,会用_interopRequireDefault函数为非模组化元件准备default值,后面统一用y['default']赋值给B。文章来源地址https://www.toymoban.com/news/detail-818092.html

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "A", {
  enumerable: true,
  get: function get() {
    return _x.A;
  }
});
Object.defineProperty(exports, "B", {
  enumerable: true,
  get: function get() {
    return _y["default"];
  }
});
exports["default"] = void 0;
var _x = require("/x.js");
var _y = _interopRequireDefault(require("/y.js"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
_x.A.name = 'shanghai';
_y["default"].name = 'chongqing';
var _default = {
  A: _x.A,
  B: _y["default"]
};
exports["default"] = _default;

到了这里,关于浏览器require加载devextreme-react组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 火狐浏览器提示“无法加载您的Firefox配置文件”解决方法

    火狐浏览器提示“无法加载您的Firefox配置文件”解决方法分享。最近有用户在电脑开启火狐浏览器来使用的时候,软件出现了一个问题,提示无法加载Firefox配置文件。这样导致浏览器无法正常的使用了。那么如何去快速的处理这个问题呢?一起来看看以下的处理方法吧。 解

    2024年02月11日
    浏览(63)
  • 前端学习之浏览器从输入URL到页面加载的全过程

    从输入URL到页面加载的主干流程如下: 1、浏览器的地址栏输入URL并按下回车。 2、浏览器查找当前URL的DNS缓存记录。 3、DNS解析URL对应的IP。 4、根据IP建立TCP连接(三次握手)。 5、HTTP发起请求。 6、服务器处理请求,浏览器接收HTTP响应。 7、渲染页面,构建DOM树。 8、关闭

    2023年04月23日
    浏览(29)
  • 当使用Selenium WebDriver 加载页面时出现浏览器闪退时,如何解决?

    Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,今天在针对js动态网页爬虫时,使用代理并使用Selenium,打开网页时,浏览器总是一闪而退,代码如下: from selenium import webdriver from seleniumwire import webdriver from selenium.webd

    2023年04月09日
    浏览(26)
  • 从浏览器输入url到页面加载(五)请求数据在网线中的故事

    前言 上一章我们说到了,为了确保连接通道已建立完成,进行 三次握手 的确认。但无论是请求页面,还是发送一个ajax请求,数据都是要达到服务器的,包括header头,body信息这些。一旦离开了客户端浏览器,再离开了客户端操作系统,就要开始 漫长的网线旅程 了。 目录 前

    2024年02月10日
    浏览(28)
  • 手机浏览器看视频加载太慢怎么办,这5招用了提速快

    在下班后或者午休前的闲暇时间里,很多人喜欢用手机浏览器看视频来放松自己。最近,看到一些朋友说使用手机浏览器看视频加载太慢,没有在电脑看视频速度快,遇到这种情况应该怎么办呢?今天就为大家说道说道,教你5招解决看视频慢的问题。   1、本地网络速度太慢

    2024年02月12日
    浏览(39)
  • 从浏览器输入url到页面加载(六)前端必须了解的路由器和光纤小知识

    前言 上一章我们说到了 数据包 在网线中的故事,说到了 双绞线 ,还说到了 麻花 。这一章继续沿着这条线路往下走,说一些和cdn以及路由器相关,运营商以及光纤相关的小知识,前端同学应该了解一下的   目录 前言 1.  CDN和路由器有关系吗? 2. 你的电脑能直接上网吗?

    2024年02月09日
    浏览(38)
  • Not allowed to launch ‘videowebplugin://‘ because a user gesture is require;高版本google浏览器,海康插件启动失败解决办

    问题:使用海康视频插件,插件在谷歌浏览器中启动失败问题(这个海康插件实在是坑人) 原因: 是因为海康的插件还没支持高版本谷歌,emmmmmmmmmmmm 解决办法: 第一种:  第二种: 百度都找不到这个问题。海康官网的问题清单也没有记录,希望对别的同学有用

    2024年02月16日
    浏览(64)
  • Android项目在 app 中通过 WebView 访问 url显示空白,使用浏览器可以打开,Android WebView加载出现空白页面问题解决

    服务器证书校验主要针对 WebView 的安全问题。 在 app 中需要通过 WebView 访问 url,因为服务器采用的自签名证书,而不是 ca 认证,使用 WebView 加载 url 的时候会显示为空白,出现无法加载网页的情况。 使用 ca 认证的证书,在 WebView 则可以直接显示出来,不需要特殊处理。 以往

    2024年02月04日
    浏览(37)
  • Selenium调用使用360浏览器,QQ浏览器,遨游浏览器,猎豹浏览器,Chromium

    国产的360安全浏览器,360急速浏览器,QQ浏览器,遨游浏览器甚至新版还未上市的Edge浏览器都是基于Chrome浏览器的开源版本Chronium开发来的。所以360浏览器可以理解为一个定制的Chrome浏览器,最新360安全浏览器是基于Chromium 63版本的,落后正式的Chrome版本。 我们下载对应的2

    2024年02月06日
    浏览(35)
  • 浏览器:浏览器指纹

    一、引子 场景一、绑定用户与浏览器(设备),比如某一个网站的账号给到用户,用户只能在自己的电脑的某浏览器使用。 场景二、精准推送广告。 场景三、公司做营销活动,防止活动奖品被程序薅羊毛。 等等场景我们有什么技术方法实现或避免呢,本文介绍浏览器指纹来

    2024年02月06日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包