前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >react-native-web

react-native-web

原创
作者头像
conanma
修改于 2021-11-02 09:55:30
修改于 2021-11-02 09:55:30
3.1K00
代码可运行
举报
文章被收录于专栏:正则正则
运行总次数:0
代码可运行

React-native项目引入React-native-web

安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install react react-dom react-native-web --save

如果使用了 ART,需要安装 react-art(比如,使用了 react-native-svg 来做RN端icon方案,这就是基于 react-art)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i react-art --save

安装好之后,使用主要分一下两步:

  • 入口处新增配置
  • webpack配置

入口处新增配置

有两种方式:

  • 使用 AppRegistry API
  • 使用 render 方法
使用 AppRegistry API

在新增配置之前,首先看看RN的入口文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// index.js
import { AppRegistry } from 'react-native';
import App from './App';

AppRegistry.registerComponent('rn_web', () => App);

新增配置之后,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// index.web.js
import { AppRegistry } from 'react-native';
import App from './App';

AppRegistry.registerComponent('rn_web', () => App);

AppRegistry.runApplication('rn_web', {
    rootTag: document.getElementById('react-root')
});
使用 render 方法

使用 render 方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { render } from 'react-native';
import App from './App';

render(<App/>, rootTag: document.getElementById('react-root'));

可以看到,AppRegistry API 更贴近RN的写法,render 方法跟 ReactDOM.render 是一个意思。

以上,就能够将现有RN页面转成web页面了

接下来,以 AppRegistry API 为入口,看看 react-native-web 做了什么

react-native-web 源码分析

从三部分来对源码进行分析:

  • 入口,即 AppRegistry API
  • API,即对 RN API 实现
  • 组件,即对 RN 组件实现

入口:AppRegistry API

入口文件代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// index.web.js
import { AppRegistry } from 'react-native';
import App from './App';

AppRegistry.registerComponent('rn_web', () => App);

AppRegistry.runApplication('rn_web', {
    rootTag: document.getElementById('react-root')
});

webpack配置

webpack配置就跟普通 React web 应用配置一致即可,然后新增alias配置,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// webpack.config.js
module.exports = {
  // ...the rest of your config
  resolve: {
    alias: {
      'react-native$': 'react-native-web'
    }
  }
}

那我们来来看看这两个 API 都做了什么

AppRegistry.registerComponent
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const runnables = {};
static registerComponent(appKey: string, componentProvider: ComponentProvider): string {
    runnables[appKey] = {
        getApplication: appParameters => getApplication(componentProviderInstrumentationHook(componentProvider), appParameters ? appParameters.initialProps : emptyObject, wrapperComponentProvider && wrapperComponentProvider(appParameters)),
        run: appParameters => renderApplication(componentProviderInstrumentationHook(componentProvider), appParameters.initialProps || emptyObject, appParameters.rootTag, wrapperComponentProvider && wrapperComponentProvider(appParameters), appParameters.callback)
    };
    return appKey;
}

以例子代码为例,此方法就是定义了 runnables['rn_web'] 对象,此对象有 getApplication、run 两个方法

AppRegistry.runApplication
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static runApplication(appKey: string, appParameters: Object): void {
    runnables[appKey].run(appParameters);
}

以例子代码为例,此方法就是调用了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
runnables['rn_web'].run({
    rootTag: document.getElementById('react-root')
})

这里的 appParameters 数据结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    initialProps, // 初始props
    rootTag, // root DOM节点
    callback, // 回调函数
}
renderApplication
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { render } from 'react-dom';
const renderFn = render;
function renderApplication<Props: Object>(RootComponent: ComponentType<Props>, initialProps: Props, rootTag: any, WrapperComponent?: ?ComponentType<*>, callback?: () => void) {
    renderFn(
        <AppContainer WrapperComponent={WrapperComponent} rootTag={rootTag}>
            <RootComponent {...initialProps} />
        </AppContainer>,
        rootTag,
        callback
    );
}

实际调用的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ReactDOM.render(
    <AppContainer WrapperComponent={WrapperComponent} rootTag={rootTag}>
        <App {...initialProps} />
    </AppContainer>,
    rootTag,
    callback
);
AppContainer
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default class AppContainer extends Component<Props, State> {
  state = { mainKey: 1 };

  static childContextTypes = {
    rootTag: any
  };

  static propTypes = {
    WrapperComponent: any,
    children: node,
    rootTag: any.isRequired
  };

  getChildContext(): Context {
    return {
      rootTag: this.props.rootTag
    };
  }

  render() {
    const { children, WrapperComponent } = this.props;
    let innerView = (
      <View
        children={children}
        key={this.state.mainKey}
        pointerEvents="box-none"
        style={styles.appContainer}
      />
    );

    if (WrapperComponent) {
      innerView = <WrapperComponent>{innerView}</WrapperComponent>;
    }
    return (
      <View pointerEvents="box-none" style={styles.appContainer}>
        {innerView}
      </View>
    );
  }
}

const styles = StyleSheet.create({
  appContainer: {
    flex: 1
  }
});

API

以 StyleSheet 为例,分析 react-native-web API 源码

我们都知道,RN中使用的样式表是CSS的子集,我们来看看 react-native-web 对样式表的处理

StyleSheet
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const StyleSheet = {
  absoluteFill,
  absoluteFillObject,
  compose(style1, style2) {
    ...
  },
  create(styles) {
    ...
  },
  flatten: flattenStyle,
  hairlineWidth: 1
};

RN的StyleSheet模块有以下几个方法和常量:

1、方法:

  • setStyleAttributePreprocessor(此方法存在风险)
  • create
  • flatten

2、常量:

  • hairlineWidth
  • absoluteFill
  • absoluteFillObject

可以发现,react-native-web 中 StyleSheet 定义了除 setStyleAttributePreprocessor(此方法存在风险)方法之外的所有方法和常量。此外,还新增了 compose 方法,此方法在 react-native-web 的组件中使用

首先来看看 StyleSheet.create 方法

StyleSheet.create
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create(styles) {
  const result = {};
  Object.keys(styles).forEach(key => {
    const id = styles[key] && ReactNativePropRegistry.register(styles[key]);
    result[key] = id;
  });
  return result;
}

代码比较简单,主要就是遍历styles,对所有styles调用 ReactNativePropRegistry.register 获取对应的id,返回对应 key-id 的对象。我们先看个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
  ellipsis: {
    width: 200,
  }
});

console.log(styles);

我们来看看打印出来的styles是什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{container: 78, welcome: 79, instructions: 80, ellipsis: 81}

接着来看看 ReactNativePropRegistry.register 做了什么

ReactNativePropRegistry
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const emptyObject = {};
const objects = {};
const prefix = 'r';
let uniqueID = 1;

const createKey = id => `${prefix}-${id}`;

export default class ReactNativePropRegistry {
  static register(object: Object): number {
    const id = uniqueID++;
    if (process.env.NODE_ENV !== 'production') {
      Object.freeze(object);
    }
    const key = createKey(id);
    objects[key] = object;
    return id;
  }

  static getByID(id: number): Object {
    if (!id) {
      return emptyObject;
    }
    const key = createKey(id);
    const object = objects[key];
    if (!object) {
      return emptyObject;
    }
    return object;
  }
}

这个模块,定义了两个方法:register、getByID,register 是将样式对象存入 objects 对象中,并返回对应的 id;getByID 则是通过 id 获取对应的样式对象

在react-native-web整个样式转换过程中,除了StyleSheet.create,还需要关注一下 StyleSheet.flatten 方法,即 flattenStyle

flattenStyle
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function getStyle(style) {
  if (typeof style === 'number') {
    return ReactNativePropRegistry.getByID(style);
  }
  return style;
}

function flattenStyle(style: ?StyleObj): ?Object {
  if (!style) {
    return undefined;
  }

  if (!Array.isArray(style)) {
    return getStyle(style);
  }

  const result = {};
  for (let i = 0, styleLength = style.length; i < styleLength; ++i) {
    const computedStyle = flattenStyle(style[i]);
    if (computedStyle) {
      for (const key in computedStyle) {
        const value = computedStyle[key];
        result[key] = value;
      }
    }
  }
  return result;
}

flattenStyle 方法接受的 styles 参数是存有样式表id的数组或变量,通过递归遍历 styles,调用上一部分提到的 ReactNativePropRegistry.getByID 方法,通过id获取对应的样式对象,并返回。

以上,我们以 StyleSheet 为例分析了 react-native-web 实现 RN API 的源码。

组件

以 View 组件为例,分析 react-native-web 组件的源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const calculateHitSlopStyle = hitSlop => {
  const hitStyle = {};
  for (const prop in hitSlop) {
    if (hitSlop.hasOwnProperty(prop)) {
      const value = hitSlop[prop];
      hitStyle[prop] = value > 0 ? -1 * value : 0;
    }
  }
  return hitStyle;
};

class View extends Component<ViewProps> {
  static displayName = 'View';

  static contextTypes = {
    isInAParentText: bool
  };

  static propTypes = ViewPropTypes;

  render() {
    const hitSlop = this.props.hitSlop;
    const supportedProps = filterSupportedProps(this.props);

    const { isInAParentText } = this.context;

    supportedProps.style = StyleSheet.compose(
      styles.initial,
      StyleSheet.compose(isInAParentText && styles.inline, this.props.style)
    );

    if (hitSlop) {
      const hitSlopStyle = calculateHitSlopStyle(hitSlop);
      const hitSlopChild = createElement('span', { style: [styles.hitSlop, hitSlopStyle] });
      supportedProps.children = React.Children.toArray([hitSlopChild, supportedProps.children]);
    }

    return createElement('div', supportedProps);
  }
}

const styles = StyleSheet.create({
  // https://github.com/facebook/css-layout#default-values
  initial: {
    alignItems: 'stretch',
    borderWidth: 0,
    borderStyle: 'solid',
    boxSizing: 'border-box',
    display: 'flex',
    flexDirection: 'column',
    margin: 0,
    padding: 0,
    position: 'relative',
    zIndex: 0,
    // fix flexbox bugs
    minHeight: 0,
    minWidth: 0
  },
  inline: {
    display: 'inline-flex'
  },
  // this zIndex-ordering positions the hitSlop above the View but behind
  // its children
  hitSlop: {
    ...StyleSheet.absoluteFillObject,
    zIndex: -1
  }
});

export default applyLayout(applyNativeMethods(View));

View 组件就是一个简单的React组件,首先关注一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default applyLayout(applyNativeMethods(View));

其中,applyNativeMethods 方法是将native的方法转换为对应的DOM方法;applyLayout 方法是对组件的生命周期函数进行重写。这部分感兴趣的小伙伴自行了解~

接下来关注一下 View 组件的 render 方法,主要是对组件的 props 做些处理,包括校验 props 是否支持、style 处理,最后调用 createElement 方法

createElement
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const createElement = (component, props, ...children) => {
  // use equivalent platform elements where possible
  let accessibilityComponent;
  if (component && component.constructor === String) {
    accessibilityComponent = AccessibilityUtil.propsToAccessibilityComponent(props);
  }
  const Component = accessibilityComponent || component;
  const domProps = createDOMProps(Component, props);
  adjustProps(domProps);
  return React.createElement(Component, domProps, ...children);
};

最终是调用了 React.createElement 方法创建 React Element,在此之前,主要做的事情就是调用 createDOMProps 方法,得到 domProps

createDOMProps
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const createDOMProps = (component, props, styleResolver) => {
  ...
  const {
    ...
    ...domProps
  } = props;

  // GENERAL ACCESSIBILITY
  ...

  // DISABLED
  ...

  // FOCUS
  // Assume that 'link' is focusable by default (uses <a>).
  // Assume that 'button' is not (uses <div role='button'>) but must be treated as such.
  ...

  // STYLE
  // Resolve React Native styles to optimized browser equivalent
  const reactNativeStyle = [
    component === 'a' && resetStyles.link,
    component === 'button' && resetStyles.button,
    role === 'heading' && resetStyles.heading,
    component === 'ul' && resetStyles.list,
    role === 'button' && !disabled && resetStyles.ariaButton,
    pointerEvents && pointerEventsStyles[pointerEvents],
    providedStyle,
    placeholderTextColor && { placeholderTextColor }
  ];
  const { className, style } = styleResolver(reactNativeStyle);
  if (className && className.constructor === String) {
    domProps.className = props.className ? `${props.className} ${className}` : className;
  }
  if (style) {
    domProps.style = style;
  }

  // OTHER
  // Link security and automation test ids
  ...
  return domProps;
};

createDOMProps 方法代码较长,这里就不全部粘贴,从几个注释可以知道,此方法主要是将各 props 转换成对应的 web 端的props,这里我们以 style 为例,看看是如何做转换的。

样式转换工作量主要在 styleResolver 方法,即调用 ReactNativeStyleResolver 实例的 resolve 方法。此方法最后会返回 className 和 style,最后会赋值到 domProps 中

styleResolver
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resolve(style) {
  // fast and cachable
  // style: id
  if (typeof style === 'number') {
    this._injectRegisteredStyle(style);
    const key = createCacheKey(style);
    return this._resolveStyleIfNeeded(style, key);
  }
  // resolve a plain RN style object
  // style: 样式对象
  if (!Array.isArray(style)) {
    return this._resolveStyleIfNeeded(style);
  }
  // flatten the style array
  // cache resolved props when all styles are registered
  // otherwise fallback to resolving
  // style: 存储id的数组
  const flatArray = flattenArray(style);
  let isArrayOfNumbers = true;
  for (let i = 0; i < flatArray.length; i++) {
    const id = flatArray[i];
    if (typeof id !== 'number') {
      isArrayOfNumbers = false;
    } else {
      this._injectRegisteredStyle(id);
    }
  }
  const key = isArrayOfNumbers ? createCacheKey(flatArray.join('-')) : null;
  return this._resolveStyleIfNeeded(flatArray, key);
}

接下来看看 _injectRegisteredStyle_resolveStyleIfNeeded

_injectRegisteredStyle
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_injectRegisteredStyle(id) {
  const { doLeftAndRightSwapInRTL, isRTL } = I18nManager;
  const dir = isRTL ? (doLeftAndRightSwapInRTL ? 'rtl' : 'rtlNoSwap') : 'ltr';
  if (!this.injectedCache[dir][id]) {
    // 根据id获取对应的样式对象
    const style = flattenStyle(id);
    // 对样式对象格式化:各样式属性排序;添加长度单位;颜色值处理;特定属性处理;返回格式化之后的样式对象
    const domStyle = createReactDOMStyle(i18nStyle(style));
    Object.keys(domStyle).forEach(styleProp => {
      const value = domStyle[styleProp];
      if (value != null) {
        // 将样式插入 WebStyleSheet(domStyleElement.sheet)中
        this.styleSheetManager.injectDeclaration(styleProp, value);
      }
    });
    // 将此样式标记为已插入
    this.injectedCache[dir][id] = true;
  }
}

其中,styleSheetManager.injectDeclaration 是基于 domStyleElement.sheet 对页面样式进行插入操作,我们可以看看转出来的web页面的样式:

[图片上传失败...(image-5cd020-1551534493771)]

_resolveStyleIfNeeded

_resolveStyleIfNeeded 方法即是调用 _resolveStyle 方法,源码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_resolveStyle(style) {
  // 获取对应id的样式对象
  const flatStyle = flattenStyle(style);
  // 对样式对象格式化:各样式属性排序;添加长度单位;颜色值处理;特定属性处理;返回格式化之后的样式对象
  const domStyle = createReactDOMStyle(i18nStyle(flatStyle));

  const props = Object.keys(domStyle).reduce(
    (props, styleProp) => {
      const value = domStyle[styleProp];
      if (value != null) {
        // 获取 WebStyleSheet 中特定样式属性及值对应的className
        // 通过 StyleSheet.create 创建的样式,会插入到 WebStyleSheet
        const className = this.styleSheetManager.getClassName(styleProp, value);
        if (className) {
          // 将此className放入props.classList中
          props.classList.push(className);
        } else {
          // Certain properties and values are not transformed by 'createReactDOMStyle' as they
          // require more complex transforms into multiple CSS rules. Here we assume that StyleManager
          // can bind these styles to a className, and prevent them becoming invalid inline-styles.
          // 单条样式属性,如果不是特殊属性,则直接放进props.style中
          // 单条样式属性是指未通过 StyleSheet.create 创建的样式
          if (
            styleProp === 'pointerEvents' ||
            styleProp === 'placeholderTextColor' ||
            styleProp === 'animationName'
          ) {
            const className = this.styleSheetManager.injectDeclaration(styleProp, value);
            if (className) {
              props.classList.push(className);
            }
          } else {
            if (!props.style) {
              props.style = {};
            }
            // 4x slower render
            props.style[styleProp] = value;
          }
        }
      }
      return props;
    },
    { classList: [] }
  );

  props.className = classListToString(props.classList);
  if (props.style) {
    props.style = prefixInlineStyles(props.style);
  }
  return props;
}

此方法主要是获取所有样式对应的 className 或者 style,并存入props中返回

以上,我们以 View 组件为例分析了 react-native-web 实现 RN 组件的源码。

我们做完源码分析之后,我们看看如何基于 react-native-web 做一些修改

实践

以 Text 组件为例,RN Text组件可以设置 numberOfLines,来实现单行或多行省略,但是react-native-web只实现了单行省略,所以我们要把多行省略的功能加上,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Text extends Component<*> {
  ...
  render() {
    ...
    // allow browsers to automatically infer the language writing direction
    otherProps.dir = dir !== undefined ? dir : 'auto';
    otherProps.style = [
      styles.initial,
      this.context.isInAParentText === true && styles.isInAParentText,
      style,
      selectable === false && styles.notSelectable,
      numberOfLines === 1 && styles.singleLineStyle,
      onPress && styles.pressable
    ];
    // 支持多行省略
    if (numberOfLines > 1) {
      otherProps.style.push({
        display: '-webkit-box',
        WebkitBoxOrient: 'vertical',
        WebkitLineClamp: numberOfLines,
        overflow: 'hidden',
        textOverflow: 'ellipsis',
      });
    }
    const component = isInAParentText ? 'span' : 'div';
    return createElement(component, otherProps);
  }
  ...
}

举的这个例子比较简单,想表达的是我们通过看react-native-web源码,在开发过程中,遇到了转换web的问题,我们可以通过修改源码、或者使用它提供的API来解决。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
证券行业新一代核心系统解决方案再升级,腾讯云数据库TDSQL与金证FS2.5与已完成互认证
4月18日,在成都举办的2025金证科技节上,腾讯云与金证股份(下称“金证”)联合发布了证券行业新一代核心系统的互认证联合方案。
小腾资讯君
2025/04/23
1660
腾讯云携手金证股份打造证券行业新一代核心系统解决方案,搭载腾讯云数据库TDSQL
近日,在金证股份主办、腾讯云承办的2023金证科技节上,腾讯云与金证股份共同发布了证券行业新一代云原生核心系统联合解决方案,金证股份与腾讯云数据库TDSQL完成产品互认证,双方将共同推进证券行业新一代核心系统国产化建设。 金证股份是国内领军的金融科技全领域服务商,也是腾讯云在证券行业的重要合作伙伴。凭借强大的整体方案服务能力,金证股份已经成为国内众多交易所、证券、基金、期货、银行、信托、保险等金融机构的首选服务商。 新一代解决方案基于金证FS2.0(证券业务综合服务平台)、腾讯云数据库TDSQL等产品共同
腾讯云数据库 TencentDB
2023/06/02
5710
腾讯云携手金证股份打造证券行业新一代核心系统解决方案,搭载腾讯云数据库TDSQL
金证与腾讯云合作再下一城 携手推动证券行业核心业务系统升级
在2024金证科技节上,岳亮和刘辉深入阐述了腾讯专有云TCE赋能金证建设最新一代证券业务综合服务平台FS2.5,以及腾讯云在助力生态连接与智慧叠加赋能财富管理新业态等领域的洞察和实践,为行业的数字化创新升级带来更多可能。
腾讯专有云
2024/06/07
4440
金证与腾讯云合作再下一城  携手推动证券行业核心业务系统升级
腾讯云TDSQL获评“2023年度可信云金融行业服务最佳实践”
7月25日,中国信息通信研究院在2023可信云大会正式发布了2023年度可信云最佳实践结果,腾讯云数据库TDSQL凭借业内领先的技术和在金融行业数字化转型丰富的实战经验,获评“2023年度可信云金融行业服务最佳实践”,这代表TDSQL推动金融行业数字化转型的一站式解决方案和服务案例受到了行业权威机构的高度认可。
腾讯云数据库 TencentDB
2023/08/03
7570
腾讯云TDSQL获评“2023年度可信云金融行业服务最佳实践”
腾讯云TDSQL助力东吴证券发布行业首个全自主创新核心交易系统,性能提升10倍
11月2日,在东吴证券科技赋能主题日活动上,东吴证券携手腾讯云等合作伙伴正式发布行业首个全面自主创新核心交易系统。该系统全面采用国产软硬件技术栈,在行业率先实现了全国产技术支撑核心交易系统全栈上线、全业务覆盖和全客户迁移。
腾讯云数据库 TencentDB
2023/11/05
5020
腾讯云TDSQL助力东吴证券发布行业首个全自主创新核心交易系统,性能提升10倍
首个国产分布式数据库调研:TDSQL产品技术及服务能力排名第一
日前,ITPUB & IT168 联合出品的首个《国产分布式数据库选型及满意度调查报告》正式发布,据介绍,本次调研数据来自于面向ITPUB、ChinaUnix社区用户回收的1391份问卷和超200次的金融企业定向电话微信调查,及近30位金融企业的数据库技术专家专访。报告显示,在产品技术及服务能力上,腾讯云TDSQL最受用户推崇。 数据库选型一直是业界最热议的话题之一,尤其是近年来在国产化的浪潮下,分布式数据库更是广受关注。此次调研针对金融行业,采访了近30位金融行业数据库领域技术专家,其中81%受访
腾讯云数据库 TencentDB
2021/12/30
9520
国产数据库再突破!
向大家报告好消息: 腾讯云分布式数据库TDSQL日前在东吴证券新一代核心交易系统中成功落地! 这是继在银行业率先打造首个传统核心国产数据库替换案例后,腾讯云TDSQL在券商核心交易系统场景下再次取得突破 东吴证券新一代核心交易系统,也成为行业首个从基础设施、底层系统到全业务安全可控的核心交易系统。 目前,系统已稳定运行两周,平稳承载了超过16万客户实盘交易,日均交易量接近亿元。 核心交易系统是券商最重要的业务系统,承载着证券交易相关的所有业务,连接着证券交易所、中登公司、期货交易所等机构。核心
腾讯云数据库 TencentDB
2021/12/28
7960
腾讯云TDSQL入选“鑫智奖·2024金融数据智能”专家推荐 TOP 10 优秀解决方案
为展示金融企业数据管理和数据平台智能化转型成果,分享大数据和人工智能在风控、营销、产品、运营等场景的落地实践,探讨“金融科技+数据智能”的创新应用和未来发展,金科创新社主办了“鑫智奖·第六届金融数据智能优秀解决方案评选”活动,目前已经连续举办了五届,“鑫智奖”聚焦行业数智化发展趋势及金融场景数智应用创新实践,激发数据智能领域磅礴的创新力量,助力打造数字金融深化发展的核心引擎。
腾讯云数据库 TencentDB
2024/04/18
2680
腾讯云TDSQL入选“鑫智奖·2024金融数据智能”专家推荐 TOP 10 优秀解决方案
腾讯云数据库落地国信证券,承载日均亿级交易额
好消息!腾讯云数据库TDSQL已在国信证券业务系统中成功落地,系统已稳定运行三个月。新系统使用了TDSQL+中标麒麟系统+海光服务器,与战略合作伙伴华云中盛共同完成,实现了证券系统全栈国产化。 国信证券 作为全国性大型综合类证券公司,在118个城市和地区共设有 57家分公司、185家营业部。根据中证协发布的数据,近年来国信证券的总资产、净资产、净资本、营业收入、净利润等核心指标排名行业前列。 行业数据显示,传统券商交易系统对性能的标准要求是能保障系统每秒委托交易峰值约每秒1万笔。证券行业作为数据极为密集的行
腾讯云数据库 TencentDB
2022/03/10
6640
双料第一!Top 5厂商中,腾讯云数据库整体收入增速、本地部署模式收入同比增速均位列第一
6月5日,全球领先的IT市场研究和咨询公司IDC发布的《2022年下半年中国关系型数据库软件市场跟踪报告》显示,在Top 5厂商中,腾讯云数据库整体收入同比增速、本地部署模式收入同比增速均位列第一。
腾讯云数据库 TencentDB
2023/07/25
5250
双料第一!Top 5厂商中,腾讯云数据库整体收入增速、本地部署模式收入同比增速均位列第一
TDSQL首次登上腾讯财报!金融机构核心系统落地实现规模化复制
11月10日,腾讯发布Q3财报,首次提到数据库对企业服务的贡献。财报显示:“腾讯云数据库TDSQL已被3000多家来自金融、公共服务和电信垂直行业的客户采用,中国十大银行中的六家都应用了该产品。TDSQL在不同金融机构核心系统中的渗透率明显提升,显示了腾讯在数据安全性、可靠性和一致性方面的能力。” (点击查看腾讯财报) 腾讯云分布式数据库TDSQL,是腾讯自主研发的一款企业级分布式数据库产品,旗下涵盖金融级分布式、云原生、分析型等多引擎融合的完整数据库产品体系,提供业界领先的金融级高可用、计算存储分离
腾讯云数据库 TencentDB
2021/11/11
8410
腾讯云国产数据库金融政企客户突破600家
喜大普奔!截止目前,TDSQL数据库的金融政企用户数突破600家。 作为一款腾讯自主研发的金融级数据库,TDSQL正在成为众多金融机构数字化升级过程中的“使命担当”。 随着国家新基建战略的推进,企业在将大量业务迁移到数字基础设施过程中,海量的、异构的数据处理带来的挑战早已超出传统数据库产品的维度。国内大型互联网公司基于分布式技术推出的自主可控数据库,为众多金融机构以及政企部门数字化升级提供了新的选择。 “高频账户类交易耗时在 300 毫秒之内、20 秒内可以完成 1 万笔批量代发代扣业务、数据库系统综合硬
腾讯云数据库 TencentDB
2020/05/15
1.1K0
实力认证!腾讯云数据库获“鼎信杯”最具影响力企业奖、最受用户青睐奖
6月30日,2023鼎信杯信息技术发展论坛举办了第二届“鼎信杯”大赛颁奖典礼,腾讯云数据库TDSQL凭借一站式国产化替换解决方案、业界领先的产品性能和丰富的落地应用案例,斩获鼎信杯“最具影响力企业奖”、“最受用户青睐奖”两项大奖。
腾讯云数据库 TencentDB
2023/07/25
3390
实力认证!腾讯云数据库获“鼎信杯”最具影响力企业奖、最受用户青睐奖
TDSQL 2021:致未来的年终总结
在云计算发展和国产化趋势的双重驱动下,国产数据库需求迎来爆发式增长。回首过去一年,TDSQL凭借优秀的产品性能、优质的技术服务和日渐壮大的合作生态,得到业界广泛认可,金融核心系统客户数国内领先。 2022年,在更高的起点上,TDSQL将再度出发,推动国产数据库发展迈入新篇章。 系列技术持续创新 布局前沿应用场景 当传统技术架构逐渐难以满足产业互联网时代的需求时,转型升级是必然的趋势选择。在金融政企技术系统对国产化、数字化改造升级需求愈发迫切的背景下,TDSQL从不同应用场景匹配不同引擎,为客户提供融合统
腾讯云数据库 TencentDB
2022/01/07
5730
腾讯云携手高阳金信发布“银行核心系统无感上云”联合方案
3月18日,腾讯云携手高阳金信正式推出“银行核心系统无感上云”联合解决方案,旨在降低云方案成本、提升友好度、提高实施效率,在满足金融场景的基础上验证可视化、工具化能力。双方以金融数字化转型为契机,实现产品上云、业务上云,提升银行业分布式处理、敏捷部署和动态伸缩等能力,增强多地多中心、高可用场景能力,为银行业核心系统提供一体化解决方案。 高阳金信作为第一家拥有银行核心系统自主知识产权的中国公司、第一家实现核心系统跨平台运行的公司、第一家生产应用自研中间件的中国公司,在国有银行、股份制银行中的市场占有率第一,
腾讯云数据库 TencentDB
2022/03/21
9440
面对股市,券商比你更害怕
释放数据价值,助力数智转型,本次腾讯全球数字生态大会数据库专场中,各路大咖为我们带来腾讯云数据库的最新动态:全域解决方案、TDSQL新品发布、合作伙伴计划……以下是金证股份的负责人钟桂全在大会分享的图文和视频回顾,请查收~ 关注“腾讯云数据库”公众号,回复“0911钟桂全”,即可下载直播分享PPT。 大家好,我是金证股份钟桂全,负责金证公司在证券行业的产品研发工作,非常高兴和荣幸能代表金证公司参加腾讯全球数字生态大会,今天我的分享主题是《分布式数据库在证券行业交易与结算领域的应用》。 Part1
腾讯云数据库 TencentDB
2020/09/24
8630
连续三年!我们做到了
腾讯云数据库TDSQL连续三年助力金融客户荣获中国人民银行体系金融科技奖项。“银行科技发展奖”是我国金融业唯一的金融科技部级奖项,由中国人民银行于1992年设立,是展现银行业信息科技最新成果、最高成就的奖项,在业内具有较强的权威性和广泛的影响力。2020年,为进一步发挥激励创新、引领发展、协同共赢作用,“银行科技发展奖”在弘扬优良传统的基础上,发展为“金融科技发展奖”,评选范围由单一银行机构,扩大为银行、保险、证券等金融行业机构。 诞生于2007年的腾讯云自研企业级分布式数据库TDSQL,经历了腾讯业务的飞
腾讯云数据库 TencentDB
2022/05/26
1.4K0
连续三年!我们做到了
全国经济第一县为什么选择腾讯云数据库TDSQL
8月16日,昆山农商银行举行新一代银行核心系统建设启动仪式。据了解,该系统将采用长亮科技最新“微服务+单元化”架构核心系统建设方案,并将国产分布式数据库腾讯云TDSQL作为核心系统承载,有效解决传统集中式核心系统性能瓶颈,提升高可用性和动态扩容能力。 这是腾讯云 “核心业务系统+分布式数据库”在银行传统核心中的再次落地。此前,腾讯TDSQL分布式数据库已经应用于张家港农商银行新一代核心业务系统,并成功投产运营。本次昆山农商银行采用腾讯TDSQL金融级分布式数据库,支撑长亮科技新一代“微服务+单元化”架
腾讯云数据库 TencentDB
2020/08/25
1.2K0
官方盖章!腾讯云数据库TDSQL通过金融分布式数据库检测
1月21日,北京国家金融科技认证中心正式发布《2021年分布式数据库标准符合性检测参检机构名单》,腾讯云分布式数据库TDSQL名列其中,成为首款通过检测的互联网公司数据库产品,同时标志着TDSQL满足分布式数据库金融行业标准的各项要求,可以更有力支撑金融机构的业务系统。 数据库是承载金融数据的关键信息基础设施,也是金融机构的信息库和核心中枢。分布式数据库具有水平扩展、高可靠、高可用、低成本等关键特性,已经成为金融行业数字化转型的重要支撑。近年来,随着金融业务数据量的爆发式增长,金融行业对分布式数据库的技
腾讯云数据库 TencentDB
2022/01/25
1.1K0
腾讯云数据库联手宇信科技发布联合方案,全面助力金融科技安全可控
近日,腾讯云联手宇信科技,共同完成了信贷平台、数据中台、手机银行等核心金融业务的联合解决方案,以及双向适配认证、深度测试和优化工作,并已在某头部农商行、某头部城商行投产运行。未来,双方将在信贷系统和国产数据库的深度适配测试、监管报送国产化联合方案、云原生PaaS平台双向适配认证等领域持续推进合作。 新一代智能信贷服务平台V5.0深度适配 TDSQL是腾讯云自主研发的企业级分布式数据库,提供业界领先的高可用、计算存储分离、数据仓库等能力,具备智能运维平台等标准统一的产品服务方案,可满足各行业需求。历时3个多月
腾讯云数据库 TencentDB
2022/07/12
7520
腾讯云数据库联手宇信科技发布联合方案,全面助力金融科技安全可控
推荐阅读
证券行业新一代核心系统解决方案再升级,腾讯云数据库TDSQL与金证FS2.5与已完成互认证
1660
腾讯云携手金证股份打造证券行业新一代核心系统解决方案,搭载腾讯云数据库TDSQL
5710
金证与腾讯云合作再下一城 携手推动证券行业核心业务系统升级
4440
腾讯云TDSQL获评“2023年度可信云金融行业服务最佳实践”
7570
腾讯云TDSQL助力东吴证券发布行业首个全自主创新核心交易系统,性能提升10倍
5020
首个国产分布式数据库调研:TDSQL产品技术及服务能力排名第一
9520
国产数据库再突破!
7960
腾讯云TDSQL入选“鑫智奖·2024金融数据智能”专家推荐 TOP 10 优秀解决方案
2680
腾讯云数据库落地国信证券,承载日均亿级交易额
6640
双料第一!Top 5厂商中,腾讯云数据库整体收入增速、本地部署模式收入同比增速均位列第一
5250
TDSQL首次登上腾讯财报!金融机构核心系统落地实现规模化复制
8410
腾讯云国产数据库金融政企客户突破600家
1.1K0
实力认证!腾讯云数据库获“鼎信杯”最具影响力企业奖、最受用户青睐奖
3390
TDSQL 2021:致未来的年终总结
5730
腾讯云携手高阳金信发布“银行核心系统无感上云”联合方案
9440
面对股市,券商比你更害怕
8630
连续三年!我们做到了
1.4K0
全国经济第一县为什么选择腾讯云数据库TDSQL
1.2K0
官方盖章!腾讯云数据库TDSQL通过金融分布式数据库检测
1.1K0
腾讯云数据库联手宇信科技发布联合方案,全面助力金融科技安全可控
7520
相关推荐
证券行业新一代核心系统解决方案再升级,腾讯云数据库TDSQL与金证FS2.5与已完成互认证
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验