ttk-app-core
Version:
@ttk/recat enterprise develop framework
381 lines (318 loc) • 13.9 kB
Markdown
* 将原index.html、vendor目录、sso.html、transfer.html、version.txt等静态资源移至本工程public目录下(除checkLowBrowser.js外,其他均可覆盖),具体需要移动的静态资源见原webpack.config.js文件中CopyWebpackPlugin配置了哪些
* 原目录图片资源assets/img调整至src/assets/img
* 原目录assets其他less配置,大部分为框架less引用,业务很少修改,不再需要,若业务在此配置了样式,请配置至src/assets下的app.less(app应用的公共样式)、base.less(全局基础样式)、varible.less(变量)
* 原目录component/assets资源文件参考上两项修改
* 原目录apps下所有目录文件移至src/jsonApps下
原目录component组件分离为@ttk/component依赖包,不包括以下业务组件
* MoneyCellHeader
* MoneyCell
* QuanAndForeCurrency
* SubjectDisplay
* AccountDisplay
* TableSettingCard
* TableOperate
* TableOperate2
* PrintOption
* PrintOption4
* PrintOption3
* FormDecorator
* GridDecorator
* VirtualTable
* VirtualTable2
业务组件可按以下方式使用:
```
export { default as MoneyCellHeader } from './momeny/moneyCellHeader'
export { default as MoneyCell } from './momeny/moneyCell'
export { default as QuanAndForeCurrency } from './momeny/quanAndForeCurrency'
export { default as SubjectDisplay } from './momeny/subjectDisplay'
export { default as AccountDisplay } from './momeny/accountDisplay'
export { default as TableSettingCard } from './tableSettingCard'
export { default as TableOperate } from './tableOperate'
export { default as TableOperate2 } from './tableOperate2'
export { default as PrintOption } from './printOption'
export { default as PrintOption4 } from './printOption/inventoryPrint'
export { default as PrintOption3 } from './printOption/indexFinance'
export { default as FormDecorator } from './decorator/form'
export { default as GridDecorator } from './decorator/grid'
export { default as VirtualTable } from './virtualTable'
export { default as VirtualTable2 } from './virtualTable-2'
```
例如src/components/virtualTable/index.js文件
```
import React, { Fragment } from 'react'
import VirtualTable from './virtualTable'
import ResizeVirtualTable from './resizeVirtualTable'
import './style.less' // 增加less文件引入
// ...省略代码
```
* 组件从@ttk/component引入,如下面例子中的Select
* 旧别名尽量修改为依赖包的名称,如edf-utils修改为 @ttk/utils,edf-component 修改为 @ttk/component等
* 删除无用import
例如:
```
import ModalComponent from '../modal/index'
import Select from "../select/index";
import utils from 'edf-utils'
const Modal = ModalComponent
```
修改为
```
import { Modal, Select } from '@ttk/component'
import { number } from '@ttk/utils'
const utils = { number };
```
* 组件:原目录component组件分离为@ttk/component依赖包,不一致或业务新增的可在src/components自定义组件
* 工具类:目录utils分离为@ttk/utils依赖包,不一致或业务新增的可在src/utils自定义组件
* 常量:原目录constant移至src/constant
* api:原目录api移至src/api
* 目录modules、global不再使用,不需要
* 目录app-loader分离为@ttk/app-loader依赖包,一般不修改
* 目录meta-engine分离为@ttk/meta-engine依赖包,一般不修改
* webpack开头相关配置文件不再需要,配置开发代理在config/devServer.js, 其他均在fx.webpack.config.js
src/jsonApps/config.js
```
function configFetch() {
// 在此配置
fetch.config(
// ...省略代码,原配置代码位于工程目录下config.js
)
}
```
src/constant/index.js,如
```
const EDFX_APP_ROOT = 'edfx-app-root';
const TTK_EDF_APP_ROOT = 'ttk-edf-app-root';
const APP_ROOT_NAME = 'app-root';
/**
* 启动app名,需要根据实际情况配置,默认使用hook的路由,启动app名为app-root。
* 如果需要使用json原路由方式,请修改为'ttk-edf-app-root'或'edfx-app-root'
*/
const startAppName = EDFX_APP_ROOT;
```
config/devServer.js
fx.webpack.config详细见改文件注释说明
* 框架将自动扫描jsonApps目录中的app和相关style.less文件并引入,模块不需要theme目录、index.js、index.less
文件,可以使用npm run delModulesConfig自动删除
* 框架将自动扫描jsonApps目录中的mock.js文件并引入,因此需要删除业务apps中无用mock.js,部分mock.js存在语法错误,编译时会报错
src/api/index.js,全部替换'../api'为'../jsonApps', 例如:
```
import { person } from '../api/ba/app-card-person/webapi'
修改为
import { person } from '../jsonApps/ba/app-card-person/webapi'
```
* 依赖包不要使用相对路径
```
import { Checkbox } from '../../../../../node_modules/antd'; // 直接修改为依赖包,'@ttk/component'或'antd'
import {fromJS} from "../../../node_modules/immutable/dist/immutable"; // 直接修改为依赖包,'immutable'
```
* import或者url()引入vendor目录中的图片资源文件,编译打包会生成1个文件、copy插件又复制1个文件,重复了。请移至src/assets/img,使用@/assets/img(@为src别名)引入,或者在fx.webpack.config.js配置别名。当然也可移至业务app内其他合适位置
```
import img from '../../../../vendor/img/gl/blank.png'
// 移至src/assets/img后, 修改引入路径
import img from '@/assets/img/gl/blank.png'
.bg-login-bg-3{
background-image: url("../../../vendor/img/login/login-bg-3.png");
}
// 移至src/assets/img后, 修改引入路径
.bg-login-bg-3{
background-image: url("@/assets/img/login/login-bg-3.png");
}
```
若修改位置较多,也可以移动图片后,在fx.webpack.config.js配置别名,不用修改引入的代码
```
fxAlias: {
'../../../vendor/img': path.resolve(__dirname, 'src/assets/img'),
'../../../../vendor/img': path.resolve(__dirname, 'src/assets/img'),
},
```
* 对于其他非import或者url()引入的图片资源,是不会经过webpack编译,应规范使用正确src路径,例如
```
{
name: 'audited',
component: '::img',
className: 'app-proof-of-charge-title-right-tag',
src: '../../../vendor/img/gl/audited_charge.png',
_visible: '{{$getAudited()}}'
}
// data.js中直接配置src的,该路径将直接成为html中img元素的src属性
<img src="../../../vendor/img/gl/audited_charge.png">
// 因此,src相对路径应该是基于index.html,而非data.js, 即正确规范的路径应为'./vendor/img/gl/audited_charge.png'
```
* 组件独立为@ttk/component依赖包后,引用路径修改
```
import FormDecorator from '../../../component/decorator/form'
// 修改为
import { FormDecorator } from '@ttk/component'
import GridDecorator from '../../../component/decorator/grid'
// 修改为
import { GridDecorator } from '@ttk/component'
```
* utils独立为npm包后,引用路径修改
```
import {
isAcrobatInstalledInIE
} from '../../../../../utils/fetch/pdfplugin'
//修改为
import { fetch } from '@ttk/utils'
const {
isAcrobatInstalledInIE
} = fetch;
import { trimLeft, trimRight, trim } from '../../../utils/string/index'
// 修改为
import { math, string } from 'edf-utils'
const { trimLeft, trimRight, trim } = string
```
* 不要使用core-js相关引用,直接使用es6等新语法,编译会兼容的。
```
import { isArray } from "core-js/fn/array"; // 删除,直接使用Array.isArray
import { Number } from 'core-js' // 删除,直接使用Number
```
* js文件中不要使用typescript语法, 编译会报错, 例如
```
// invoices/components/print/createContainer.js
export const createContainer = () => {
const element: HTMLDivElement = document.createElement("div");
element.className = "print-wrapper";
const container = document.body.appendChild(element);
return container;
};
// 删除: HTMLDivElement
```
* 删除无使用的引用, 例如
```
import table from '../../../component/components/table/table'
import error from "../../../component/components/modal/error"
import webapi from '../../../../api'
```
* 框架升级后app样式也是按需加载的,app使用其他app定义的样式, 将不在正常显示,应在src/assets/app.less配置app公共样式
例如:App申报缴款ttk-edf-app-electronic-tax中的data.js使用了App通用Iframe嵌套页ttk-edf-app-iframe在style.less定义的className,ttk-edf-app-iframe-iframe
```
{
name: 'ttkIframe',
id: 'ttkIframe',
key: '{{data.random}}',
className: 'ttk-edf-app-iframe-iframe',
onload: '{{$changeFrameHeight}}',
_visible: '{{!!data.src}}',
component: '::iframe',
height: '600',
scrolling: 'auto',
src: '{{data.src}}',
}
```
例如:App申报缴款ttk-edf-app-electronic-tax中的data.js使用了App通用Iframe嵌套页ttk-edf-app-iframe在style.less定义的className,ttk-edf-app-iframe-iframe
```
{
name: 'ttkIframe',
id: 'ttkIframe',
key: '{{data.random}}',
className: 'ttk-edf-app-iframe-iframe',
onload: '{{$changeFrameHeight}}',
_visible: '{{!!data.src}}',
component: '::iframe',
height: '600',
scrolling: 'auto',
src: '{{data.src}}',
}
```
* app的style.less文件定义的css类选择器,不包括在当前app名称的css类选择器下,则当app加载时,会覆盖其他app的样式
例如:operation/ttk-edf-app-simple-portal/style.less
```
// 不包括在当前app名称的css类选择器下, 成为全局css类选择器,会覆盖其他app的样式
.ant-menu.mk-menu.ant-menu-root {
max-height: 300px;
overflow-y: auto;
}
// 当前app名称的css类选择器
.ttk-edf-app-simple-portal{
// ...省略
}
.left-menu-itemgroup {
// ...省略
}
// ...省略
```
* app的style.less文件定义的css类,不包括在当前app名称的css类下,则当app加载时,会覆盖其他app的样式
例如:operation/ttk-edf-app-simple-portal/style.less,定义了
```
const ret = await this.metaAction.modal('confirm', {
title: '',
// 传给modal的className
className: 'ttk-scm-app-inventory-automaticcalculationxb-confirm',
width: 400,
content: <p>{title}</p>
})
```
例如:edfba/ttk-app-inventory-list/util/DataGrid.js
```
getColumns() {
// ...省略代码
// renderDataGridCol返回React创建的element
columns = columns.map(m => renderDataGridCol({ ...colOption, ...m }))
// let tableSettingData =
// (this.props.metaAction.gf("data.other.columns") &&
// this.props.metaAction.gf("data.other.columns").toJS()) ||
// []
const tableSettingData = this.metaAction.gf('data.tableData.tableSettingData').toJS();
if (Array.isArray(tableSettingData) && tableSettingData.length > 0) {
let cols = []
columns.forEach(item => {
let cell =
item.key === "id" || item.key === "option"
? item
: tableSettingData.find(
f => f.fieldName === item.key && f.isVisible
)
if (cell) {
// 此次直接修改了react element 的props
item.props.width = cell.width || item.props.width
cols.push(item)
}
})
return cols
}
return columns
}
```
两种解决方法: 1、在React创建element前修改props,比如上例的renderDataGridCol前
2、使用React.cloneElement复制element
```
item.props.width = cell.width || item.props.width
cols.push(item)
// 修改为
let ele = React.cloneElement(item, {width: cell.width || item.props.width})
cols.push(ele)
```
* URL使用javascript:;
Warning: A future version of React will block javascript: URLs as a security precaution. Use event handlers instead if you can. If you need to generate unsafe HTML try using dangerouslySetInnerHTML instead. React was passed "javascript:;".
in a (created by TableCell)
```
<a href='javascript:;' onClick={(value) => { handleRangeSetting('inventoryTypeList') }}>设置</a>
```