Skip to content

Commit bfdf9e9

Browse files
sonofmagicZakaryCode
authored andcommitted
docs: modify docs/css-in-js at same time
1 parent bffbe98 commit bfdf9e9

File tree

1 file changed

+267
-0
lines changed

1 file changed

+267
-0
lines changed

docs/css-in-js.mdx

Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,273 @@ export default Index
147147
- `styled(View)` 写法会产生类型错误,[#8883](https://github.com/NervJS/taro/issues/8883)
148148
- 与微信小程序直播插件 `live-player-plugin` 共用时报错,[#7389](https://github.com/NervJS/taro/issues/7389)
149149

150+
## Panda
151+
152+
[`pandacss`](https://panda-css.com/) 是个新兴的优秀 `CSS-in-JS` 编译时框架,相比 `linaria`,它的配置更加简单,智能提示好,开发者体验也更好。
153+
154+
而且它也吸收了许多 `tailwindcss` 的优点,我们可以自由的配置我们的主题与样式,且原子化的类名也更容易进行自由组合。
155+
156+
[`weapp-pandacss`](https://github.com/sonofmagic/weapp-pandacss) 就是让你在小程序开发中使用它。
157+
158+
### 快速开始
159+
160+
#### pandacss 安装和配置
161+
162+
##### 0. 安装和初始化 pandacss
163+
164+
首先我们需要把 `@pandacss/dev` 这些都安装和配置好,这里我们以 `tarojs` 项目为例:
165+
166+
```bash
167+
npm install -D @pandacss/dev weapp-pandacss postcss # 或者 yarn / pnpm
168+
npx panda init
169+
```
170+
171+
此时会在当前目录生成一个 `panda.config.ts` 和一个包含大量文件的 `styled-system`
172+
173+
> `panda.config.ts``pandacss` 的配置文件,`styled-system` 文件夹里的是 `pandacss` 的运行时 `js`
174+
175+
`styled-system` 加入我们的 `.gitignore` 中去。
176+
177+
```diff
178+
# .gitignore
179+
+ styled-system
180+
```
181+
182+
##### 1. 配置 postcss
183+
184+
接着在根目录里,添加一个 `postcss.config.cjs` 文件,写入以下代码注册 `pandacss`:
185+
186+
```js
187+
module.exports = {
188+
plugins: {
189+
'@pandacss/dev/postcss': {}
190+
}
191+
}
192+
```
193+
194+
##### 2. 检查你的 panda.config.ts
195+
196+
生成的配置文件大概长下面这样,尤其注意 `include` 是用来告诉 `pandacss` 从哪些文件中提取原子类的,所以这个配置一定要准确
197+
198+
```ts
199+
import { defineConfig } from "@pandacss/dev"
200+
201+
export default defineConfig({
202+
// 小程序不需要
203+
preflight: process.env.TARO_ENV === 'h5',
204+
// ⚠️这里,假如你使用 vue,记得把 vue 文件格式包括进来!!!
205+
include: ["./src/**/*.{js,jsx,ts,tsx}"],
206+
exclude: [],
207+
theme: {
208+
extend: {}
209+
},
210+
outdir: "styled-system",
211+
})
212+
```
213+
214+
##### 3. 修改 package.json 脚本
215+
216+
然后,我们添加下方 `prepare` 脚本在我们的 `package.json``scripts` 块中:
217+
218+
```diff
219+
{
220+
"scripts": {
221+
+ "prepare": "panda codegen",
222+
}
223+
}
224+
```
225+
226+
这样我们每次重新 `npm i/yarn/pnpm i` 的时候,都会执行这个方法,重新生成 `styled-system`,当然你也可以直接通过 `npm run prepare` 直接执行这个脚本。
227+
228+
##### 4. 全局 css 注册 pandacss
229+
230+
然后在我们的全局样式文件 `src/app.scss` 中注册 `pandacss`:
231+
232+
```css
233+
@layer reset, base, tokens, recipes, utilities;
234+
```
235+
236+
配置好了之后,此时 `pandacss``h5` 平台已经生效了,你可以 `npm run dev:h5``h5` 平台初步使用了,但是为了开发体验,我们还有一些优化项要做。
237+
238+
##### 5. 配置的优化与别名
239+
240+
来到根目录的 `tsconfig.json` 添加:
241+
242+
```diff
243+
{
244+
"compilerOptions": {
245+
"paths": {
246+
"@/*": [
247+
"src/*"
248+
],
249+
+ "styled-system/*": [
250+
+ "styled-system/*"
251+
+ ]
252+
}
253+
},
254+
"include": [
255+
"./src",
256+
"./types",
257+
"./config",
258+
+ "styled-system"
259+
],
260+
}
261+
```
262+
263+
接着来到 `config/index.ts` 添加 `alias`([参考链接](https://taro-docs.jd.com/docs/config-detail#alias)):
264+
265+
```ts
266+
import path from 'path'
267+
268+
{
269+
alias: {
270+
'styled-system': path.resolve(__dirname, '..', 'styled-system')
271+
},
272+
}
273+
```
274+
275+
这样我们就不需要使用相对路径来使用 `pandacss` 了,同时 `ts` 智能提示也有了,你可以这样使用它:
276+
277+
```ts
278+
import { View, Text } from "@tarojs/components";
279+
import { css } from "styled-system/css";
280+
281+
const styles = css({
282+
bg: "yellow.200",
283+
rounded: "9999px",
284+
fontSize: "90px",
285+
p: "10px 15px",
286+
color: "pink.500",
287+
});
288+
289+
export default function Index() {
290+
return (
291+
<View className={styles}>
292+
<Text>Hello world!</Text>
293+
</View>
294+
);
295+
}
296+
```
297+
298+
> 此部分参考的官方链接 <https://panda-css.com/docs/installation/postcss>
299+
300+
接下来进入 `weapp-pandacss` 的插件配置,不用担心,相比前面那些繁琐的步骤,这个可简单多了。
301+
302+
#### weapp-pandacss 配置
303+
304+
> 记得安装好 `weapp-pandacss` !
305+
306+
##### 0. 回到 postcss 进行注册
307+
308+
回到项目根目录的 `postcss.config.cjs` 注册 `weapp-pandacss`,添加以下配置:
309+
310+
```diff
311+
module.exports = {
312+
plugins: {
313+
'@pandacss/dev/postcss': {},
314+
+ 'weapp-pandacss/postcss': {}
315+
}
316+
}
317+
```
318+
319+
##### 1. 回到 package.json 添加生成脚本
320+
321+
然后去 `package.json` 你添加 `prepare` 脚本的地方,加点代码
322+
323+
```diff
324+
{
325+
"scripts": {
326+
- "prepare": "panda codegen",
327+
+ "prepare": "panda codegen && weapp-panda codegen",
328+
}
329+
}
330+
```
331+
332+
> 注意这里必须用 `&&` 而不能用 `&``&` 任务执行会并行不会等待,而 `&&` 会等待前一个执行完成再执行后一条命令
333+
334+
然后,你再手动执行一下
335+
336+
```bash
337+
npm run prepare
338+
```
339+
340+
来重新生成 `styled-system`, 此时你会发现 `pandacss` 的命令行输出中多了 `2` 行:
341+
342+
```diff
343+
✔️ `src/styled-system/css`: the css function to author styles
344+
✔️ `src/styled-system/tokens`: the css variables and js function to query your tokens
345+
✔️ `src/styled-system/patterns`: functions to implement apply common layout patterns
346+
✔️ `src/styled-system/jsx`: styled jsx elements for react
347+
+ ✔️ `src/styled-system/weapp-panda`: the core escape function for weapp
348+
+ ✔️ `src/styled-system/helpers.mjs`: inject escape function into helpers
349+
```
350+
351+
这代表着小程序相关的转义逻辑已经被注入进去,此时 `panda css` 生成的类就兼容小程序平台啦,是不是很简单?
352+
353+
当然为了防止你配置失败,我也给出了参考项目: [taro-react-pandacss-template](https://github.com/sonofmagic/taro-react-pandacss-template) 方便进行排查纠错。
354+
355+
### 常见问题
356+
357+
#### 跨平台注意事项
358+
359+
你可能同时开发 `小程序``h5` 平台,但是你发现使用 `weapp-pandacss` 之后,`h5` 平台似乎就不行了?
360+
361+
这时候你可以这样配置:
362+
363+
`process.env.TARO_ENV === 'h5'` 的时候,不去加载 `weapp-pandacss/postcss` (根据环境变量动态加载 `postcss` 插件)
364+
365+
同时你也可以执行 `weapp-panda rollback``css` 方法进行回滚到最原始适配 `h5` 平台的状态。
366+
367+
当然你恢复到小程序版本也只需要执行 `weapp-panda codegen` 就会重新注入了。
368+
369+
#### 小程序预览事项
370+
371+
当小程序预览时会出现 `Error: 非法的文件,错误信息:invalid file: pages/index/index.js, 565:24, SyntaxError: Unexpected token . if (variants[key]?.[value])` 错误。
372+
373+
这是因为 `panda` 生成的文件 `cva.mjs` 使用了 [`Optional chaining (?.)`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining)语法,这个语法小程序原生不支持,这时候可以开启勾选 `将JS编译成ES5` 功能再进行预览,或者使用 `babel` 预先进行处理再上传预览。
374+
375+
### 高级配置文件
376+
377+
你可以通过 `npx weapp-panda init` 命令在当前目录下创建一个 `weapp-pandacss.config.ts` 配置文件。
378+
379+
这个配置文件可以用来控制转义代码的生成和一部分 `postcss` 插件的行为。
380+
381+
```ts
382+
import { defineConfig } from 'weapp-pandacss'
383+
384+
export default defineConfig({
385+
postcss: {
386+
// 转义插件是否生效,这只能控制核心插件的生效情况,而核心插件只是一部分
387+
// 假如你想让整个插件真正不生效,请在 `postcss.config.cjs` 里进行动态加载判断
388+
disabled: false,
389+
// 数组merge默认行为是直接concat 合并,所以传一个空数组是使用的默认数组
390+
// 转义替换对象
391+
selectorReplacement: {
392+
root: [],
393+
universal: [],
394+
cascadeLayers: 'a'
395+
},
396+
removeNegationPseudoClass: true
397+
},
398+
// 生成上下文
399+
context: {
400+
// 转义注入判断条件,更改后需要重新生成代码
401+
escapePredicate: `process.env.TARO_ENV !== 'h5' && process.env.TARO_ENV !== 'rn'`,
402+
// 插件的 pandaConfig 寻找配置
403+
pandaConfig: {
404+
cwd: process.cwd(),
405+
file: 'path/to/your-panda-config-file'
406+
}
407+
}
408+
})
409+
```
410+
411+
当然,你更改相关的配置项之后,要重新执行一下 `npm run prepare` 来生成新的注入转义代码。
412+
413+
### 参考示例
414+
415+
[taro-react-pandacss-template](https://github.com/sonofmagic/taro-react-pandacss-template)
416+
150417
## Fower
151418

152419
社区还有另一个方案 **Fower**[文档](https://fower.vercel.app/docs/use-with-taro)

0 commit comments

Comments
 (0)