Security News
Weekly Downloads Now Available in npm Package Search Results
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
AD UI 的基本使命是帮助微信广告相关后台系统正确地成功。
AD UI 是从 components 独立出的项目,它包含且只包含微信广告基础 UI 组件。 components 组件库已经为我们解决的问题:敏捷开发,代码复用。
我将从 components 的开发现状出发,解释 AD UI 为什么需要独立存在,以及我们重新建立一套项目的目的。 components 的使用方式是 git submodule。现在的 submodule 实质上就是:云端共享文件夹。
现在这个文件夹:
.scss
/ .less
);我将这个文件夹下的 .js
文件分为两类:业务复用代码 与 基础 UI 组件。业务复用代码 指的是 color-picker、joyride、广告预览组件等;基础 UI 组件 指的是大多在 /basic/ 下的文件。
两者的区别在于,前者是或多或少个项目中使用;后者是需要长期维护的文件。
以上列出的 4 点,对于 业务复用代码 来说,其实没什么问题。由于复用代码和业务项目完全挂钩,开发流程、loader 这些问题,都倚靠业务项目。
submodule 在解决 业务复用代码 这个问题上,是敏捷的、高效的。AD UI 的建立并不是为了推翻 submodule,是因为 submodule 不适合 基础 UI 组件 这样一个完整的项目:
在经历了两年多的维护过程后,基础 UI 组件 因为没有版本、issue 等开发流程,也没有测试的过程,导致我很难去梳理与总结这个项目的发展历程。这是 AD UI 在今天终于出现的原因。
除了以上所说的 开发方式,我们也将从另一个方向对 基础 UI 组件 进行重构,即 组件设计。
getDerivedStateFromProps
,实现内部驱动 + 外部控制,以下会详细说明这两种设计方法;components 对我来说从视觉设计、到组件设计,都是一次不正确的实践。 视觉设计方面,视觉设计师的原话是,components 做得 “不完整”。从结果上来看,break changes 也非常多。这并不是我在归咎于视觉设计,这本就是我们共同的项目。 组件设计方面,我对 prop 与 UI State 的理解不够充分,整体结构也存在许多问题。
components 并不是失败的,但它对我来说是不正确的。重新建立,就是我们要付出的代价。
我希望做正确的事,我希望对于每一个组件都填补从前 组件设计 上的缺陷;我希望对于 开发方式 做一次正确的实践。 对于将来,AD UI 也许是不正确的。但至少让我现在弥补从前的错误。
AD UI 在做出改变。只有做得好的东西才有资格去改变。AD UI 必须做好。
Ant:“Ant Design 不能保证你的业务一定成功。但是它能保证你的业务正确地成功,或是正确地失败。” AD UI 的基本使命是帮助微信广告相关后台系统正确地成功。
^15.6.2
,基于 16,我们可以不需要 polyfill 地使用 getDerivedStateFromProps, fragments,createPortal 这三个对组件开发非常重要的特性,因为 mpweb 项目所依赖的 React 仍为 ^15.6.2
。tnpm install -S @tencent/adUI@latest
adUI 对 scss 使用 css modules,因此需要在项目中配置。 配置示例之后加上。
import { Button } from '@tencent/adUI';
ReactDOM.render(<Button />, mountNode);
adUI 的开发任务:
具体说明如下:
Vscode 插件需要:ESlint + styleint。
adUI 的文档生成工具是 bisheng。bisheng 默认使用 browser history,为了能直接摆到 cdn 上,因此我修改了一下变成 hash-history:@tencent/bisheng-hash-history。
对于 site 文件夹的具体解释以后补全。
以 button 为例:
button
│ index.js 组件出口
│ Button.js 组件文件
└───__tests__ enzyme + jest 单元测试
│ │ ...
└───demo
│ │ basic.md md 会被 bisheng 解析,可在 md 中定义 order/title,以及书写 jsx 代码
│ │ others.md
└───style
│ button.scss scss 出口
│ base.scss 组件样式
组件的书写规范由以下方面限制:
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import styles from "./style/index.scss"
/**
* 按钮用于开始一个即时操作。
*/
export default class Button extends Component {
static propTypes = {
/**
* 子节点
*/
children: PropTypes.node,
/**
* 附加类名
*/
className: PropTypes.string,
/**
* 是否禁用
*/
disabled: PropTypes.bool,
}
static defaultProps = {
children: "",
className: null,
disabled: false,
}
render() {
...
}
}
如果这个组件是有状态变化的(即不是 functional component),那组件需要实现内部驱动 + 外部控制。
<Checkbox />
这样的 Checkbox 会自己完成勾选、反勾选,因为 Checkbox 内部有自己的 state。
如果想要 Checkbox 默认勾选,并且是内部驱动的,需要使用 prop defaultChecked
:
<Checkbox defaultChecked />
<Checkbox checked onChange={checked => console.log(checked)}>
这个 Checkbox 在每次点击时都会触发 onChange,但因为没有重新传入 checked prop,所以 Checkbox 的状态永远不会发生变化。在 mpweb 这样复杂的业务中很少使用内部驱动,而是用这样的方式使用:
const { checked } = this.state
<Checkbox checked={checked} onChange={checked => this.setState({ checked }) } />
内部驱动避免了业务逻辑中出现单纯为了控制组件 UI State 的逻辑。 比如:
<Tabs defaultValue={0} onChange={value => console.log(value)}>
<Tabs.Tab title="外层" value={0} />
<Tabs.Tab title="推广页" value={1} />
</Tabs>
如果使用者不想记录 Tabs 的切换状态,只是想在切换的时候得到组件的通知,这时候 Tabs 的 value 就是这里所说的 UI State。在以前的实现中,组件几乎都偏向于 PureComponent 的实现。这样,业务中每使用一次组件,就必须存储该组件的状态,因此就会产生非常多的,”只是为了让组件的表现正常“的多余状态出现在业务逻辑中。 这是非常错误和多余的。
内部驱动和外部控制的实现,使得 UI 组件状态非常完善和灵活。
enzyme + jest 书写测试用例。正在学习。 关于测试:
expect(<Button />).toMatchSnapshot()
;npm run test
是跑全部测试,并生成 coverage,本地查看:adUI/coverage/lcov-report/index.html
,请尽力提高 statements 的覆盖率;jest components/button
,请确保全局安装了 jest
。待规范
提交规范现在使用了 commitlint + husky
自动在 git pre-commit hook 时检测。同样在这时候会执行 stylelint 和 eslint。
未来会使用 commitlint 做自动化 changelog。此处感谢 charlieyin 推荐此工具。
现在推荐的 commit 示例:
feat(Button): 添加 focus prop。
fix(Button): 修复 focus 问题。
refactor(Button): 调整 scss 结构。
docs(Button): 添加 demo。
test(Button): 添加快照。
FAQs
Unknown package
The npm package adui receives a total of 290 weekly downloads. As such, adui popularity was classified as not popular.
We found that adui demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
Security News
A Stanford study reveals 9.5% of engineers contribute almost nothing, costing tech $90B annually, with remote work fueling the rise of "ghost engineers."
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.