需要:
客户的我的项目须要用咱们的性能,且须要提供个modal嵌入到他们的我的项目里,在他们的table中点击对应的item,弹出我提供的modal。
解决方案
我的项目应用cra构建,应用webpack的library导出为一个库给第三方应用, 官网教程创立 library
output: { library: 'Geek' }
这样的话客户就能够间接window.Geek.showModal()
调用咱们的弹窗,
index.js
import React from 'react';import ReactDOM from 'react-dom';import App from './App';import './index.css';import 'antd/dist/antd.less';import { defaultAuditRecord } from 'constants/configration';const modalState = {};const createContainer = () => { const container = document.createElement('div'); container.setAttribute('id', 'container'); document.body.append(container);};const renderApp = (showBtn) => { ReactDOM.render( <React.StrictMode> <App modalState={modalState} showBtn={showBtn} /> </React.StrictMode>, document.getElementById('container') );};// 渲染sdkexport const mount = (showBtn) => { createContainer(); renderApp(showBtn);};// 显示弹窗export const showModal = (record = defaultAuditRecord, callback = () => {}) => { // record 为{id:1,user:""} modalState.showModal(record, callback);};export const closeModal = () => { modalState.closeModal();};// mount(true);
客户调用sdk
const handleAuditBtnClick = useCallback( (record) => () => { window.Geek.showModal( { id: record.id, user: record.username }, (event) => { // sdk的modal操作动作执行后的回调 if ( event === AuditModalEvent.SAVE_SUCCESS || event === AuditModalEvent.SUBMIT_SUCCESS || event === AuditModalEvent.CANCEL_SUCCESS ) { fetchList(); } } ); }, [fetchList] ); useEffect(() => { window.Geek.mount(); }, []);
遇到的坑
自定义款式抵触
sdk我的项目应用的是styled-components,咱们内部测试sdk的我的项目也是用styled-components创立的,我本认为该库生成的classname是随机的,然而两个我的项目生成的classname很多都是反复的,解体。。。 最容易想到的是为sdk所有classname加个前缀。
package.json"babel": { "presets": [ "@babel/preset-env" ], "plugins": [ [ "babel-plugin-styled-components", { "namespace": "jit-sdk" } ] ]},
- antd的款式跟客户的款式抵触
客户的我的项目也用到了antd,只不过是vue版的,然而有些款式是一样的。 - sdk 在客户的我的项目中编译报错 unexpected token
客户的我的项目是vue3的环境,将sdk放在src目录下编译就会报错,那么只好绕过编译,将生成的sdk.js 放到public目录下,在index.html用script标签间接援用,这样就不会报错了。