@coze-arch/cli 0.0.1-alpha.db1c06 → 0.0.1-alpha.dcc485

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/README.md +1 -0
  2. package/lib/__templates__/expo/_npmrc +1 -0
  3. package/lib/__templates__/expo/client/components/Screen.tsx +2 -2
  4. package/lib/__templates__/expo/client/eslint.config.mjs +7 -0
  5. package/lib/__templates__/expo/client/scripts/install-missing-deps.js +10 -10
  6. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/index.js +9 -0
  7. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/rule.js +112 -0
  8. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/tech.md +94 -0
  9. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/index.js +9 -0
  10. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/rule.js +120 -0
  11. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/tech.md +58 -0
  12. package/lib/__templates__/nextjs/AGENTS.md +54 -0
  13. package/lib/__templates__/nextjs/README.md +5 -0
  14. package/lib/__templates__/nextjs/eslint.config.mjs +5 -0
  15. package/lib/__templates__/nextjs/next.config.ts +1 -2
  16. package/lib/__templates__/nextjs/package.json +2 -5
  17. package/lib/__templates__/nextjs/pnpm-lock.yaml +1028 -5
  18. package/lib/__templates__/nextjs/scripts/build.sh +4 -1
  19. package/lib/__templates__/nextjs/scripts/dev.sh +8 -2
  20. package/lib/__templates__/nextjs/scripts/start.sh +7 -1
  21. package/lib/__templates__/nextjs/src/app/layout.tsx +1 -1
  22. package/lib/__templates__/nextjs/src/app/page.tsx +1 -2
  23. package/lib/__templates__/nextjs/src/server.ts +35 -0
  24. package/lib/__templates__/nextjs/tsconfig.json +1 -1
  25. package/lib/__templates__/nuxt-vue/.coze +12 -0
  26. package/lib/__templates__/nuxt-vue/AGENTS.md +42 -0
  27. package/lib/__templates__/nuxt-vue/README.md +73 -0
  28. package/lib/__templates__/nuxt-vue/_gitignore +24 -0
  29. package/lib/__templates__/nuxt-vue/_npmrc +23 -0
  30. package/lib/__templates__/nuxt-vue/app/app.vue +6 -0
  31. package/lib/__templates__/nuxt-vue/app/pages/index.vue +23 -0
  32. package/lib/__templates__/nuxt-vue/assets/css/main.css +24 -0
  33. package/lib/__templates__/nuxt-vue/nuxt.config.ts +116 -0
  34. package/lib/__templates__/nuxt-vue/package.json +35 -0
  35. package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +8759 -0
  36. package/lib/__templates__/nuxt-vue/postcss.config.mjs +8 -0
  37. package/lib/__templates__/nuxt-vue/public/favicon.ico +0 -0
  38. package/lib/__templates__/nuxt-vue/public/robots.txt +2 -0
  39. package/lib/__templates__/nuxt-vue/scripts/build.sh +14 -0
  40. package/lib/__templates__/nuxt-vue/scripts/dev.sh +39 -0
  41. package/lib/__templates__/nuxt-vue/scripts/prepare.sh +14 -0
  42. package/lib/__templates__/nuxt-vue/scripts/start.sh +21 -0
  43. package/lib/__templates__/nuxt-vue/server/api/hello.ts +10 -0
  44. package/lib/__templates__/nuxt-vue/server/middleware/logger.ts +10 -0
  45. package/lib/__templates__/nuxt-vue/server/routes/health.ts +10 -0
  46. package/lib/__templates__/nuxt-vue/tailwind.config.js +13 -0
  47. package/lib/__templates__/nuxt-vue/template.config.js +87 -0
  48. package/lib/__templates__/nuxt-vue/tsconfig.json +18 -0
  49. package/lib/__templates__/taro/README.md +57 -45
  50. package/lib/__templates__/taro/config/index.ts +106 -41
  51. package/lib/__templates__/taro/config/prod.ts +4 -5
  52. package/lib/__templates__/taro/eslint.config.mjs +62 -6
  53. package/lib/__templates__/taro/package.json +19 -4
  54. package/lib/__templates__/taro/patches/@tarojs__plugin-mini-ci@4.1.9.patch +30 -0
  55. package/lib/__templates__/taro/pnpm-lock.yaml +912 -206
  56. package/lib/__templates__/taro/src/app.css +140 -36
  57. package/lib/__templates__/taro/src/components/ui/accordion.tsx +159 -0
  58. package/lib/__templates__/taro/src/components/ui/alert-dialog.tsx +260 -0
  59. package/lib/__templates__/taro/src/components/ui/alert.tsx +60 -0
  60. package/lib/__templates__/taro/src/components/ui/aspect-ratio.tsx +36 -0
  61. package/lib/__templates__/taro/src/components/ui/avatar.tsx +84 -0
  62. package/lib/__templates__/taro/src/components/ui/badge.tsx +37 -0
  63. package/lib/__templates__/taro/src/components/ui/breadcrumb.tsx +117 -0
  64. package/lib/__templates__/taro/src/components/ui/button-group.tsx +83 -0
  65. package/lib/__templates__/taro/src/components/ui/button.tsx +67 -0
  66. package/lib/__templates__/taro/src/components/ui/calendar.tsx +394 -0
  67. package/lib/__templates__/taro/src/components/ui/card.tsx +108 -0
  68. package/lib/__templates__/taro/src/components/ui/carousel.tsx +228 -0
  69. package/lib/__templates__/taro/src/components/ui/checkbox.tsx +58 -0
  70. package/lib/__templates__/taro/src/components/ui/code-block.tsx +169 -0
  71. package/lib/__templates__/taro/src/components/ui/collapsible.tsx +71 -0
  72. package/lib/__templates__/taro/src/components/ui/command.tsx +385 -0
  73. package/lib/__templates__/taro/src/components/ui/context-menu.tsx +614 -0
  74. package/lib/__templates__/taro/src/components/ui/dialog.tsx +256 -0
  75. package/lib/__templates__/taro/src/components/ui/drawer.tsx +192 -0
  76. package/lib/__templates__/taro/src/components/ui/dropdown-menu.tsx +561 -0
  77. package/lib/__templates__/taro/src/components/ui/field.tsx +228 -0
  78. package/lib/__templates__/taro/src/components/ui/hover-card.tsx +282 -0
  79. package/lib/__templates__/taro/src/components/ui/input-group.tsx +197 -0
  80. package/lib/__templates__/taro/src/components/ui/input-otp.tsx +136 -0
  81. package/lib/__templates__/taro/src/components/ui/input.tsx +56 -0
  82. package/lib/__templates__/taro/src/components/ui/label.tsx +24 -0
  83. package/lib/__templates__/taro/src/components/ui/menubar.tsx +595 -0
  84. package/lib/__templates__/taro/src/components/ui/navigation-menu.tsx +264 -0
  85. package/lib/__templates__/taro/src/components/ui/pagination.tsx +118 -0
  86. package/lib/__templates__/taro/src/components/ui/popover.tsx +291 -0
  87. package/lib/__templates__/taro/src/components/ui/portal.tsx +19 -0
  88. package/lib/__templates__/taro/src/components/ui/progress.tsx +28 -0
  89. package/lib/__templates__/taro/src/components/ui/radio-group.tsx +64 -0
  90. package/lib/__templates__/taro/src/components/ui/resizable.tsx +346 -0
  91. package/lib/__templates__/taro/src/components/ui/scroll-area.tsx +34 -0
  92. package/lib/__templates__/taro/src/components/ui/select.tsx +438 -0
  93. package/lib/__templates__/taro/src/components/ui/separator.tsx +30 -0
  94. package/lib/__templates__/taro/src/components/ui/sheet.tsx +262 -0
  95. package/lib/__templates__/taro/src/components/ui/skeleton.tsx +17 -0
  96. package/lib/__templates__/taro/src/components/ui/slider.tsx +203 -0
  97. package/lib/__templates__/taro/src/components/ui/sonner.tsx +1 -0
  98. package/lib/__templates__/taro/src/components/ui/switch.tsx +55 -0
  99. package/lib/__templates__/taro/src/components/ui/table.tsx +142 -0
  100. package/lib/__templates__/taro/src/components/ui/tabs.tsx +114 -0
  101. package/lib/__templates__/taro/src/components/ui/textarea.tsx +54 -0
  102. package/lib/__templates__/taro/src/components/ui/toast.tsx +517 -0
  103. package/lib/__templates__/taro/src/components/ui/toggle-group.tsx +120 -0
  104. package/lib/__templates__/taro/src/components/ui/toggle.tsx +77 -0
  105. package/lib/__templates__/taro/src/components/ui/tooltip.tsx +455 -0
  106. package/lib/__templates__/taro/src/lib/hooks/use-keyboard-offset.ts +37 -0
  107. package/lib/__templates__/taro/src/lib/measure.ts +115 -0
  108. package/lib/__templates__/taro/src/lib/platform.ts +12 -0
  109. package/lib/__templates__/taro/src/lib/utils.ts +6 -0
  110. package/lib/__templates__/taro/src/presets/dev-debug.ts +23 -0
  111. package/lib/__templates__/taro/src/presets/h5-container.tsx +15 -0
  112. package/lib/__templates__/taro/src/presets/h5-navbar.tsx +97 -30
  113. package/lib/__templates__/taro/src/presets/h5-styles.ts +192 -5
  114. package/lib/__templates__/taro/src/presets/index.tsx +4 -4
  115. package/lib/__templates__/templates.json +32 -0
  116. package/lib/__templates__/vite/AGENTS.md +41 -0
  117. package/lib/__templates__/vite/README.md +190 -11
  118. package/lib/__templates__/vite/_gitignore +1 -0
  119. package/lib/__templates__/vite/eslint.config.mjs +6 -1
  120. package/lib/__templates__/vite/package.json +10 -3
  121. package/lib/__templates__/vite/pnpm-lock.yaml +755 -15
  122. package/lib/__templates__/vite/scripts/build.sh +4 -1
  123. package/lib/__templates__/vite/scripts/dev.sh +9 -2
  124. package/lib/__templates__/vite/scripts/start.sh +9 -3
  125. package/lib/__templates__/vite/server/routes/index.ts +31 -0
  126. package/lib/__templates__/vite/server/server.ts +65 -0
  127. package/lib/__templates__/vite/server/vite.ts +67 -0
  128. package/lib/__templates__/vite/tsconfig.json +4 -3
  129. package/lib/__templates__/vite/vite.config.ts +4 -0
  130. package/lib/cli.js +99 -92
  131. package/package.json +6 -3
  132. package/lib/__templates__/taro/src/presets/wx-debug.ts +0 -23
@@ -0,0 +1,8 @@
1
+ const config = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ };
7
+
8
+ export default config;
@@ -0,0 +1,2 @@
1
+ User-Agent: *
2
+ Disallow:
@@ -0,0 +1,14 @@
1
+ #!/bin/bash
2
+ set -Eeuo pipefail
3
+
4
+ COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-$(pwd)}"
5
+
6
+ cd "${COZE_WORKSPACE_PATH}"
7
+
8
+ echo "Installing dependencies..."
9
+ pnpm install --prefer-frozen-lockfile --prefer-offline --loglevel debug --reporter=append-only
10
+
11
+ echo "Building the Nuxt.js project..."
12
+ npx nuxt build
13
+
14
+ echo "Build completed successfully!"
@@ -0,0 +1,39 @@
1
+ #!/bin/bash
2
+ set -Eeuo pipefail
3
+
4
+ <% if (process.env.NODE_ENV === 'test') { %>
5
+ # 测试环境:支持环境变量覆盖端口
6
+ PORT="${PORT:-<%= port %>}"
7
+ COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-$(pwd)}"
8
+ DEPLOY_RUN_PORT="${DEPLOY_RUN_PORT:-${PORT}}"
9
+ <% } else { %>
10
+ PORT=<%= port %>
11
+ COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-$(pwd)}"
12
+ DEPLOY_RUN_PORT=<%= port %>
13
+ <% } %>
14
+
15
+ cd "${COZE_WORKSPACE_PATH}"
16
+
17
+ kill_port_if_listening() {
18
+ local pids
19
+ pids=$(ss -H -lntp 2>/dev/null | awk -v port="${DEPLOY_RUN_PORT}" '$4 ~ ":"port"$"' | grep -o 'pid=[0-9]*' | cut -d= -f2 | paste -sd' ' - || true)
20
+ if [[ -z "${pids}" ]]; then
21
+ echo "Port ${DEPLOY_RUN_PORT} is free."
22
+ return
23
+ fi
24
+ echo "Port ${DEPLOY_RUN_PORT} in use by PIDs: ${pids} (SIGKILL)"
25
+ echo "${pids}" | xargs -I {} kill -9 {}
26
+ sleep 1
27
+ pids=$(ss -H -lntp 2>/dev/null | awk -v port="${DEPLOY_RUN_PORT}" '$4 ~ ":"port"$"' | grep -o 'pid=[0-9]*' | cut -d= -f2 | paste -sd' ' - || true)
28
+ if [[ -n "${pids}" ]]; then
29
+ echo "Warning: port ${DEPLOY_RUN_PORT} still busy after SIGKILL, PIDs: ${pids}"
30
+ else
31
+ echo "Port ${DEPLOY_RUN_PORT} cleared."
32
+ fi
33
+ }
34
+
35
+ echo "Clearing port ${PORT} before start."
36
+ kill_port_if_listening
37
+ echo "Starting Nuxt dev server on port ${PORT}..."
38
+
39
+ PORT=$PORT npx nuxt dev
@@ -0,0 +1,14 @@
1
+ #!/bin/bash
2
+ set -Eeuo pipefail
3
+
4
+ COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-$(pwd)}"
5
+
6
+ cd "${COZE_WORKSPACE_PATH}"
7
+
8
+ echo "Installing dependencies..."
9
+ pnpm install --prefer-frozen-lockfile --prefer-offline
10
+
11
+ echo "Preparing Nuxt project..."
12
+ pnpm exec nuxt prepare
13
+
14
+ echo "Preparation completed successfully!"
@@ -0,0 +1,21 @@
1
+ #!/bin/bash
2
+ set -Eeuo pipefail
3
+
4
+ COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-$(pwd)}"
5
+ <% if (process.env.NODE_ENV === 'test') { %>
6
+ # 测试环境:支持环境变量覆盖端口
7
+ PORT="${PORT:-<%= port %>}"
8
+ DEPLOY_RUN_PORT="${DEPLOY_RUN_PORT:-${PORT}}"
9
+ <% } else { %>
10
+ PORT=<%= port %>
11
+ DEPLOY_RUN_PORT="${DEPLOY_RUN_PORT:-$PORT}"
12
+ <% } %>
13
+
14
+ start_service() {
15
+ cd "${COZE_WORKSPACE_PATH}"
16
+ echo "Starting Nuxt.js service on port ${DEPLOY_RUN_PORT} for production..."
17
+ PORT=${DEPLOY_RUN_PORT} node .output/server/index.mjs
18
+ }
19
+
20
+ echo "Starting Nuxt.js service on port ${DEPLOY_RUN_PORT} for production..."
21
+ start_service
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Hello API 示例
3
+ * 访问: http://localhost:<%= port %>/api/hello
4
+ */
5
+ export default defineEventHandler(() => {
6
+ return {
7
+ message: 'Hello from Nuxt API',
8
+ timestamp: new Date().toISOString(),
9
+ };
10
+ });
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 请求日志中间件(仅开发环境)
3
+ */
4
+ export default defineEventHandler((event) => {
5
+ const isDev = process.env.COZE_PROJECT_ENV !== 'PROD';
6
+
7
+ if (isDev) {
8
+ console.log(`${event.method} ${event.path}`);
9
+ }
10
+ });
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 健康检查路由
3
+ * 访问: http://localhost:<%= port %>/health
4
+ */
5
+ export default defineEventHandler(() => {
6
+ return {
7
+ status: 'ok',
8
+ timestamp: new Date().toISOString(),
9
+ };
10
+ });
@@ -0,0 +1,13 @@
1
+ /** @type {import('tailwindcss').Config} */
2
+ export default {
3
+ content: [
4
+ './app/**/*.{js,ts,jsx,tsx,vue}',
5
+ './pages/**/*.{js,ts,jsx,tsx,vue}',
6
+ './components/**/*.{js,ts,jsx,tsx,vue}',
7
+ ],
8
+ darkMode: 'media',
9
+ theme: {
10
+ extend: {},
11
+ },
12
+ plugins: [],
13
+ };
@@ -0,0 +1,87 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+ const description = `Nuxt.js(服务端 + Vue):\`coze init \${COZE_WORKSPACE_PATH} --template nuxt-vue\`
11
+ - 适用:全栈应用、需要服务端接口能力的 Vue 项目
12
+ - 特点:
13
+ - **服务端能力**:内置服务端 API 路由,可直接创建后端接口
14
+ - **Vue 3**:基于最新的 Vue 3 Composition API
15
+ - **Vite**:使用 Vite 作为构建工具,开发体验极佳
16
+ - **TypeScript**:完整的 TypeScript 支持
17
+ - **文件路由**:基于文件系统的自动路由
18
+ - **项目理解加速**:可依赖项目下 \`package.json\` 和 \`nuxt.config.ts\` 理解项目配置`;
19
+
20
+ export const paramsSchema = {
21
+ type: 'object',
22
+ properties: {
23
+ appName: {
24
+ type: 'string',
25
+ minLength: 1,
26
+ pattern: '^[a-z0-9-]+$',
27
+ description:
28
+ 'Application name (lowercase, alphanumeric and hyphens only)',
29
+ },
30
+ port: {
31
+ type: 'number',
32
+ default: 5000,
33
+ minimum: 1024,
34
+ maximum: 65535,
35
+ description: 'Development server port (for Nuxt dev server)',
36
+ },
37
+ hmrPort: {
38
+ type: 'number',
39
+ default: 6000,
40
+ minimum: 1024,
41
+ maximum: 65535,
42
+ description: 'Hot Module Replacement (HMR) port',
43
+ },
44
+ },
45
+ required: [],
46
+ additionalProperties: false,
47
+ };
48
+
49
+ const config = {
50
+ description: description,
51
+ paramsSchema,
52
+
53
+ // 显式定义默认参数,确保在渲染时可用
54
+ defaultParams: {
55
+ port: 5000,
56
+ hmrPort: 6000,
57
+ appName: 'nuxt-vue',
58
+ },
59
+
60
+ onBeforeRender: async context => {
61
+ console.log(`Creating Nuxt.js project: ${context.appName}`);
62
+ return context;
63
+ },
64
+
65
+ onAfterRender: async (_context, outputPath) => {
66
+ console.log(`\nProject created at: ${outputPath}`);
67
+ console.log('\nConfiguration:');
68
+ console.log(' - Framework: Nuxt.js');
69
+ console.log(' - TypeScript: enabled');
70
+ console.log(' - Vue: 3.x');
71
+ console.log(' - Build Tool: Vite');
72
+ console.log(` - Port: ${_context.port}`);
73
+ },
74
+
75
+ onComplete: async (_context, _outputPath) => {
76
+ // Skip additional setup in test environment
77
+ if (process.env.NODE_ENV === 'test') {
78
+ console.log('⊘ Skipping additional setup in test environment');
79
+ return;
80
+ }
81
+
82
+ console.log('\n✓ Nuxt.js project setup completed!');
83
+ console.log(' You can now start the development server');
84
+ },
85
+ };
86
+
87
+ export default config;
@@ -0,0 +1,18 @@
1
+ {
2
+ // https://nuxt.com/docs/guide/concepts/typescript
3
+ "files": [],
4
+ "references": [
5
+ {
6
+ "path": "./.nuxt/tsconfig.app.json"
7
+ },
8
+ {
9
+ "path": "./.nuxt/tsconfig.server.json"
10
+ },
11
+ {
12
+ "path": "./.nuxt/tsconfig.shared.json"
13
+ },
14
+ {
15
+ "path": "./.nuxt/tsconfig.node.json"
16
+ }
17
+ ]
18
+ }
@@ -105,56 +105,39 @@ pnpm preview:weapp # 构建并生成预览小程序二维码
105
105
  pnpm new # 交互式创建页面/组件
106
106
  ```
107
107
 
108
- ### 常用 Taro 组件
108
+ ### 组件库
109
109
 
110
- 引入方式
110
+ #### UI 组件
111
+
112
+ UI 组件位于 `@/components/ui`,推荐按需引入:
113
+
114
+ ```typescript
115
+ import { Button } from '@/components/ui/button'
116
+ import { Card, CardContent } from '@/components/ui/card'
117
+ ```
118
+
119
+ UI 组件列表:
120
+
121
+ Accordion,Alert,AlertDialog,AspectRatio,Avatar,Badge,Breadcrumb,Button,ButtonGroup,Calendar,Card,Carousel,Checkbox,CodeBlock,Collapsible,Command,ContextMenu,Dialog,Drawer,DropdownMenu,Field,HoverCard,Input,InputGroup,InputOTP,Label,Menubar,NavigationMenu,Pagination,Popover,Portal,Progress,RadioGroup,Resizable,ScrollArea,Select,Separator,Sheet,Skeleton,Slider,Sonner,Switch,Table,Tabs,Textarea,Toast,Toggle,ToggleGroup,Tooltip
122
+
123
+ #### Taro 原生组件
124
+
125
+ 可以使用的 Taro 组件(UI 未覆盖)
111
126
 
112
127
  ```typescript
113
- import { Text } from '@tarojs/components'
114
- ```
115
- - 基础组件
116
- - Text
117
- - Icon
118
- - Progress
119
- - RichText
120
- - 表单组件
121
- - Button
122
- - Checkbox
123
- - CheckboxGroup
124
- - Editor
125
- - Form
126
- - Input
127
- - Label
128
- - Picker
129
- - PickerView
130
- - PickerViewColumn
131
- - Radio
132
- - RadioGroup
133
- - Slider
134
- - Switch
135
- - Textarea
136
- - 导航组件
137
- - FunctionalPageNavigator
138
- - NavigationBar
139
- - Navigator
140
- - TabItem
141
- - Tabs
142
- - 媒体组件
143
- - Camera
144
- - Image
145
- - Video
146
- - 视图容器
147
- - ScrollView
148
- - Swiper
149
- - SwiperItem
150
- - View
128
+ import { View, Text, Icon, Image } from '@tarojs/components'
129
+ ```
130
+
131
+ Taro 原生组件列表:
132
+
133
+ Text,Icon,RichText,CheckboxGroup,Editor,Form,Picker,PickerView,PickerViewColumn,Radio,FunctionalPageNavigator,NavigationBar,Navigator,TabItem,Camera,Image,Video,ScrollView,Swiper,SwiperItem,View
151
134
 
152
135
  ### 路径别名
153
136
 
154
137
  项目配置了 `@/*` 路径别名指向 `src/*`:
155
138
 
156
139
  ```typescript
157
- import { SomeComponent } from '@/components/SomeComponent'
140
+ import { SomeComponent } from '@/components/some-component'
158
141
  import { useUserStore } from '@/stores/user'
159
142
  ```
160
143
 
@@ -164,9 +147,18 @@ import { useUserStore } from '@/stores/user'
164
147
 
165
148
  ```tsx
166
149
  // src/pages/example/index.tsx
167
- import { View, Text } from '@tarojs/components'
150
+ import { View } from '@tarojs/components'
168
151
  import { useLoad, useDidShow } from '@tarojs/taro'
169
152
  import type { FC } from 'react'
153
+ import { Button } from '@/components/ui/button'
154
+ import {
155
+ Card,
156
+ CardContent,
157
+ CardDescription,
158
+ CardFooter,
159
+ CardHeader,
160
+ CardTitle,
161
+ } from '@/components/ui/card'
170
162
  import './index.css'
171
163
 
172
164
  const ExamplePage: FC = () => {
@@ -179,8 +171,25 @@ const ExamplePage: FC = () => {
179
171
  })
180
172
 
181
173
  return (
182
- <View className="flex flex-col items-center p-4">
183
- <Text className="text-lg font-bold">Hello Taro!</Text>
174
+ <View className="p-4">
175
+ <Card>
176
+ <CardHeader>
177
+ <CardTitle>Hello Taro!</CardTitle>
178
+ <CardDescription>
179
+ 页面布局用 Taro 基础组件,交互与视觉优先用项目内置 UI 组件。
180
+ </CardDescription>
181
+ </CardHeader>
182
+ <CardContent>
183
+ <View className="text-sm text-muted-foreground">
184
+ 组件位于 src/components/ui,推荐按需从 @/components/ui/* 引入。
185
+ </View>
186
+ </CardContent>
187
+ <CardFooter className="justify-end">
188
+ <Button size="sm" onClick={() => console.log('clicked')}>
189
+ 点击
190
+ </Button>
191
+ </CardFooter>
192
+ </Card>
184
193
  </View>
185
194
  )
186
195
  }
@@ -445,10 +454,13 @@ IMPORTANT:必须使用 tailwindcss 实现样式,只有在必要情况下才
445
454
  > 项目已集成 Tailwind CSS 4.x + weapp-tailwindcss,支持跨端原子化样式:
446
455
 
447
456
  ```tsx
457
+ import { View, Text } from '@tarojs/components'
458
+ import { Button } from '@/components/ui/button'
459
+
448
460
  <View className="flex flex-col items-center justify-center min-h-screen bg-gray-100">
449
461
  <Text className="text-2xl font-bold text-blue-600 mb-4">标题</Text>
450
462
  <View className="w-full px-4">
451
- <Button className="w-full bg-blue-500 text-white rounded-lg py-3">
463
+ <Button className="w-full" size="lg">
452
464
  按钮
453
465
  </Button>
454
466
  </View>
@@ -1,22 +1,77 @@
1
+ import fs from 'node:fs';
1
2
  import path from 'node:path';
2
- import dotenv from 'dotenv';
3
3
 
4
4
  import tailwindcss from '@tailwindcss/postcss';
5
5
  import { UnifiedViteWeappTailwindcssPlugin } from 'weapp-tailwindcss/vite';
6
6
  import { defineConfig, type UserConfigExport } from '@tarojs/cli';
7
7
  import type { PluginItem } from '@tarojs/taro/types/compile/config/project';
8
-
9
- // 加载环境变量
10
- dotenv.config({ path: path.resolve(__dirname, '../.env.local') });
11
-
8
+ import dotenv from 'dotenv';
12
9
  import devConfig from './dev';
13
10
  import prodConfig from './prod';
14
11
  import pkg from '../package.json';
15
12
 
13
+ dotenv.config({ path: path.resolve(__dirname, '../.env.local') });
14
+
15
+ const generateTTProjectConfig = (outputRoot: string) => {
16
+ const config = {
17
+ miniprogramRoot: './',
18
+ projectname: '<%= appName %>',
19
+ appid: process.env.TARO_APP_TT_APPID || '',
20
+ setting: {
21
+ urlCheck: false,
22
+ es6: false,
23
+ postcss: false,
24
+ minified: false,
25
+ },
26
+ };
27
+ const outputDir = path.resolve(__dirname, '..', outputRoot);
28
+ if (!fs.existsSync(outputDir)) {
29
+ fs.mkdirSync(outputDir, { recursive: true });
30
+ }
31
+ fs.writeFileSync(
32
+ path.resolve(outputDir, 'project.config.json'),
33
+ JSON.stringify(config, null, 2),
34
+ );
35
+ };
36
+
16
37
  // https://taro-docs.jd.com/docs/next/config#defineconfig-辅助函数
17
38
  export default defineConfig<'vite'>(async (merge, _env) => {
18
- const isWeChatApp = process.env.TARO_ENV === 'weapp';
19
- const outputRoot = process.env.OUTPUT_ROOT || (isWeChatApp ? 'dist-weapp' : 'dist-web')
39
+ const outputRootMap: Record<string, string> = {
40
+ weapp: 'dist-weapp',
41
+ tt: 'dist-tt',
42
+ h5: 'dist-web',
43
+ };
44
+ const defaultOutputRoot = outputRootMap[process.env.TARO_ENV || ''] || 'dist';
45
+ const outputRoot = process.env.OUTPUT_ROOT?.trim() || defaultOutputRoot;
46
+ const isH5 = process.env.TARO_ENV === 'h5';
47
+
48
+ const buildMiniCIPluginConfig = () => {
49
+ const hasWeappConfig = !!process.env.TARO_APP_WEAPP_APPID;
50
+ const hasTTConfig = !!process.env.TARO_APP_TT_EMAIL;
51
+ if (!hasWeappConfig && !hasTTConfig) {
52
+ return [];
53
+ }
54
+ const miniCIConfig: Record<string, any> = {
55
+ version: pkg.version,
56
+ desc: pkg.description,
57
+ };
58
+ if (hasWeappConfig) {
59
+ miniCIConfig.weapp = {
60
+ appid: process.env.TARO_APP_WEAPP_APPID,
61
+ privateKeyPath: 'key/private.appid.key',
62
+ };
63
+ }
64
+ if (hasTTConfig) {
65
+ miniCIConfig.tt = {
66
+ email: process.env.TARO_APP_TT_EMAIL,
67
+ password: process.env.TARO_APP_TT_PASSWORD,
68
+ setting: {
69
+ skipDomainCheck: true,
70
+ },
71
+ };
72
+ }
73
+ return [['@tarojs/plugin-mini-ci', miniCIConfig]] as PluginItem[];
74
+ };
20
75
 
21
76
  const baseConfig: UserConfigExport<'vite'> = {
22
77
  projectName: '<%= appName %>',
@@ -33,24 +88,7 @@ export default defineConfig<'vite'>(async (merge, _env) => {
33
88
  },
34
89
  sourceRoot: 'src',
35
90
  outputRoot,
36
- plugins: [
37
- '@tarojs/plugin-generator',
38
- ...(process.env.TARO_APP_WEAPP_APPID
39
- ? ([
40
- [
41
- '@tarojs/plugin-mini-ci',
42
- {
43
- version: pkg.version,
44
- desc: pkg.description,
45
- weapp: {
46
- appid: process.env.TARO_APP_WEAPP_APPID,
47
- privateKeyPath: 'key/private.appid.key',
48
- },
49
- },
50
- ],
51
- ] as PluginItem[])
52
- : []),
53
- ],
91
+ plugins: ['@tarojs/plugin-generator', ...buildMiniCIPluginConfig()],
54
92
  defineConstants: {
55
93
  PROJECT_DOMAIN: JSON.stringify(
56
94
  process.env.PROJECT_DOMAIN ||
@@ -63,6 +101,13 @@ export default defineConfig<'vite'>(async (merge, _env) => {
63
101
  patterns: [],
64
102
  options: {},
65
103
  },
104
+ ...(process.env.TARO_ENV === 'tt' && {
105
+ tt: {
106
+ appid: process.env.TARO_APP_TT_APPID,
107
+ projectName: '<%= appName %>',
108
+ },
109
+ }),
110
+ jsMinimizer: 'esbuild',
66
111
  framework: 'react',
67
112
  compiler: {
68
113
  type: 'vite',
@@ -95,13 +140,24 @@ export default defineConfig<'vite'>(async (merge, _env) => {
95
140
  };
96
141
  },
97
142
  },
98
- UnifiedViteWeappTailwindcssPlugin({
99
- rem2rpx: true,
100
- cssEntries: [
101
- // 你 @import "tailwindcss"; 那个文件的绝对路径
102
- path.resolve(__dirname, '../src/app.css'),
103
- ],
104
- }),
143
+ ...(isH5
144
+ ? []
145
+ : [
146
+ UnifiedViteWeappTailwindcssPlugin({
147
+ rem2rpx: true,
148
+ cssEntries: [path.resolve(__dirname, '../src/app.css')],
149
+ }),
150
+ ]),
151
+ ...(process.env.TARO_ENV === 'tt'
152
+ ? [
153
+ {
154
+ name: 'generate-tt-project-config',
155
+ closeBundle() {
156
+ generateTTProjectConfig(outputRoot);
157
+ },
158
+ },
159
+ ]
160
+ : []),
105
161
  ],
106
162
  },
107
163
  mini: {
@@ -120,18 +176,21 @@ export default defineConfig<'vite'>(async (merge, _env) => {
120
176
  },
121
177
  },
122
178
  h5: {
123
- publicPath: '/',
179
+ publicPath: './',
124
180
  staticDirectory: 'static',
181
+ router: {
182
+ mode: 'hash',
183
+ },
125
184
  devServer: {
126
- port: <%= port %>,
127
- host: '0.0.0.0',
128
- open: false,
129
- proxy: {
130
- '/api': {
131
- target: 'http://localhost:<%= serverPort %>',
132
- changeOrigin: true,
133
- },
185
+ port: <%= port %>,
186
+ host: '0.0.0.0',
187
+ open: false,
188
+ proxy: {
189
+ '/api': {
190
+ target: 'http://localhost:<%= serverPort %>',
191
+ changeOrigin: true,
134
192
  },
193
+ },
135
194
  },
136
195
  miniCssExtractPluginOption: {
137
196
  ignoreOrder: true,
@@ -143,6 +202,12 @@ export default defineConfig<'vite'>(async (merge, _env) => {
143
202
  enable: true,
144
203
  config: {},
145
204
  },
205
+ pxtransform: {
206
+ enable: true,
207
+ config: {
208
+ platform: 'h5',
209
+ },
210
+ },
146
211
  cssModules: {
147
212
  enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true
148
213
  config: {
@@ -1,10 +1,9 @@
1
- import type { UserConfigExport } from "@tarojs/cli"
1
+ import type { UserConfigExport } from '@tarojs/cli';
2
2
 
3
3
  export default {
4
4
  mini: {},
5
5
  h5: {
6
- // 确保产物为 es5
7
- legacy: true,
6
+ legacy: false,
8
7
  /**
9
8
  * WebpackChain 插件配置
10
9
  * @docs https://github.com/neutrinojs/webpack-chain
@@ -31,5 +30,5 @@ export default {
31
30
  // postProcess: (context) => ({ ...context, outputPath: path.join(staticDir, 'index.html') })
32
31
  // }))
33
32
  // }
34
- }
35
- } satisfies UserConfigExport<'vite'>
33
+ },
34
+ } satisfies UserConfigExport<'vite'>;