nsbp-cli 0.2.24 → 0.2.26

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.
package/README.md CHANGED
@@ -147,7 +147,7 @@ node ./bin/nsbp.js --help # Test CLI locally
147
147
 
148
148
  - **Package Name**: `nsbp-cli`
149
149
  - **Bin Command**: `nsbp` (install globally and run `nsbp --help`)
150
- - **Version**: `0.2.24`
150
+ - **Version**: `0.2.26`
151
151
  - **Dependencies**: chalk, commander, fs-extra, inquirer
152
152
  - **Package Manager**: Uses pnpm (also compatible with npm)
153
153
  - **Node Version**: >=16.0.0
package/bin/nsbp.js CHANGED
@@ -55,19 +55,16 @@ program
55
55
  'src',
56
56
  'public',
57
57
  'scripts',
58
- 'webpack.base.js',
59
- 'webpack.client.js',
60
- 'webpack.server.js',
58
+ 'config',
59
+ 'docker',
60
+ 'docs',
61
+ '.env.example',
62
+ '.env.development',
63
+ '.env.production',
61
64
  'tsconfig.json',
62
- 'postcss.config.js',
63
65
  '.prettierrc',
64
66
  '.prettierignore',
65
67
  'gitignore',
66
- '.dockerignore',
67
- 'docker-compose.yml',
68
- 'docker-compose.dev.yml',
69
- 'Dockerfile',
70
- 'Dockerfile.dev',
71
68
  'Makefile',
72
69
  'README.md'
73
70
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nsbp-cli",
3
- "version": "0.2.24",
3
+ "version": "0.2.26",
4
4
  "description": "CLI tool for creating NSBP (Node React SSR by Webpack) projects",
5
5
  "main": "index.js",
6
6
  "homepage": "https://nsbp.erishen.cn/",
@@ -0,0 +1,13 @@
1
+ # NSBP 开发环境配置
2
+
3
+ # ==================== 运行环境配置 ====================
4
+ NODE_ENV=development
5
+ PORT=3001
6
+
7
+ # ==================== 安全配置 ====================
8
+ # 开发环境禁用速率限制(影响开发效率)
9
+ ENABLE_RATE_LIMIT=0
10
+
11
+ # ==================== 调试配置 ====================
12
+ # 启用详细日志便于调试
13
+ # DEBUG=nsbp:*
@@ -0,0 +1,33 @@
1
+ # NSBP 环境变量配置
2
+ # 复制此文件为 .env 并根据需要修改配置
3
+
4
+ # ==================== 运行环境配置 ====================
5
+ NODE_ENV=development
6
+ PORT=3001
7
+
8
+ # ==================== 安全配置 ====================
9
+ # 启用速率限制(1=启用,0=禁用)
10
+ # 开发环境建议禁用,生产环境建议启用
11
+ ENABLE_RATE_LIMIT=0
12
+
13
+ # ==================== Docker 配置(Docker 部署时使用)====================
14
+ # Docker 镜像标签(可选)
15
+ # DOCKER_IMAGE_TAG=latest
16
+
17
+ # ==================== 调试配置 ====================
18
+ # 启用详细日志(开发时有用)
19
+ # DEBUG=nsbp:*
20
+
21
+ # ==================== 性能配置 ====================
22
+ # 启用性能监控(生产环境可选)
23
+ # ENABLE_PERFORMANCE_MONITORING=0
24
+
25
+ # ==================== 其他配置 ====================
26
+ # 时区(可选)
27
+ # TZ=Asia/Shanghai
28
+
29
+ # ==================== 注意事项 ====================
30
+ # 1. 不要将 .env 文件提交到 Git(已在 .gitignore 中忽略)
31
+ # 2. 敏感信息(密钥、密码)请放在 .env.local 中
32
+ # 3. .env.local 不会被提交到 Git,适合存放敏感信息
33
+ # 4. 优先级:.env.local > .env > 默认值
@@ -0,0 +1,17 @@
1
+ # NSBP 生产环境配置
2
+
3
+ # ==================== 运行环境配置 ====================
4
+ NODE_ENV=production
5
+ PORT=3001
6
+
7
+ # ==================== 安全配置 ====================
8
+ # 生产环境启用速率限制(防止 DDoS 和暴力攻击)
9
+ ENABLE_RATE_LIMIT=1
10
+
11
+ # ==================== 性能配置 ====================
12
+ # 生产环境关闭调试日志
13
+ # DEBUG=
14
+
15
+ # ==================== 其他配置 ====================
16
+ # 时区
17
+ TZ=Asia/Shanghai
@@ -17,7 +17,21 @@ module.exports = ({ mode, entry, server, init }) => {
17
17
  entry,
18
18
  devtool: 'source-map',
19
19
  resolve: {
20
- extensions: ['.ts', '.tsx', '.js', '.jsx', '.json']
20
+ extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
21
+ alias: {
22
+ '@': path.resolve(__dirname, '../src'),
23
+ '@components': path.resolve(__dirname, '../src/component'),
24
+ '@utils': path.resolve(__dirname, '../src/utils'),
25
+ '@services': path.resolve(__dirname, '../src/services'),
26
+ '@styled': path.resolve(__dirname, '../src/styled'),
27
+ '@store': path.resolve(__dirname, '../src/store'),
28
+ '@reducers': path.resolve(__dirname, '../src/reducers'),
29
+ '@containers': path.resolve(__dirname, '../src/containers'),
30
+ '@server': path.resolve(__dirname, '../src/server'),
31
+ '@client': path.resolve(__dirname, '../src/client'),
32
+ '@css': path.resolve(__dirname, '../src/css'),
33
+ '@externals': path.resolve(__dirname, '../src/externals')
34
+ }
21
35
  },
22
36
  module: {
23
37
  rules: [
@@ -0,0 +1,346 @@
1
+ # NSBP 环境变量配置指南
2
+
3
+ ## 快速开始
4
+
5
+ ```bash
6
+ # 1. 复制环境变量模板
7
+ cp .env.example .env
8
+
9
+ # 2. 根据需要编辑 .env
10
+ nano .env
11
+
12
+ # 3. 开始开发或部署
13
+ pnpm run dev # 本地开发
14
+ docker-compose up -d # Docker 部署
15
+ ```
16
+
17
+ ---
18
+
19
+ ## 配置文件说明
20
+
21
+ ### 文件优先级
22
+
23
+ ```
24
+ .env.local (最高优先级) → .env → docker-compose.yml 默认值
25
+ ```
26
+
27
+ ### 文件列表
28
+
29
+ | 文件名 | 说明 | 提交到 Git | 使用场景 |
30
+ |-------|------|-----------|---------|
31
+ | `.env.example` | 环境变量模板 | ✅ 提交 | 新项目初始化 |
32
+ | `.env` | 默认环境配置 | ❌ 不提交 | 日常开发/部署 |
33
+ | `.env.development` | 开发环境配置 | ❌ 不提交 | 切换到开发环境 |
34
+ | `.env.production` | 生产环境配置 | ❌ 不提交 | 切换到生产环境 |
35
+ | `.env.local` | 本地敏感信息 | ❌ 不提交 | 存储密钥、密码等 |
36
+
37
+ ---
38
+
39
+ ## 快速切换环境
40
+
41
+ ### 使用 Makefile(推荐)
42
+
43
+ ```bash
44
+ # 切换到开发环境
45
+ make env-dev
46
+
47
+ # 切换到生产环境
48
+ make env-prod
49
+
50
+ # 创建本地配置文件
51
+ make env-local
52
+
53
+ # 查看当前配置
54
+ make show-env
55
+ ```
56
+
57
+ ### 手动方式
58
+
59
+ ```bash
60
+ # 切换到开发环境
61
+ cp .env.development .env
62
+
63
+ # 切换到生产环境
64
+ cp .env.production .env
65
+
66
+ # 创建本地配置
67
+ cp .env.example .env.local
68
+ ```
69
+
70
+ ---
71
+
72
+ ## 环境变量说明
73
+
74
+ ### 基础配置
75
+
76
+ ```bash
77
+ # 运行环境
78
+ NODE_ENV=development # 或 production
79
+
80
+ # 服务端口
81
+ PORT=3001
82
+
83
+ # 时区
84
+ TZ=Asia/Shanghai
85
+ ```
86
+
87
+ ### 安全配置
88
+
89
+ ```bash
90
+ # 启用速率限制
91
+ ENABLE_RATE_LIMIT=1 # 1=启用,0=禁用
92
+ ```
93
+
94
+ **建议:**
95
+ - ✅ 开发环境:`ENABLE_RATE_LIMIT=0`(不影响开发效率)
96
+ - ✅ 生产环境:`ENABLE_RATE_LIMIT=1`(防止 DDoS 攻击)
97
+
98
+ ### 调试配置
99
+
100
+ ```bash
101
+ # 启用详细日志
102
+ DEBUG=nsbp:*
103
+ ```
104
+
105
+ ---
106
+
107
+ ## 使用场景
108
+
109
+ ### 场景 1:新项目初始化
110
+
111
+ ```bash
112
+ # 1. 克隆项目
113
+ git clone <repository-url>
114
+ cd nsbp
115
+
116
+ # 2. 复制环境变量模板
117
+ cp .env.example .env
118
+
119
+ # 3. 安装依赖
120
+ pnpm install
121
+
122
+ # 4. 启动开发环境
123
+ pnpm run dev
124
+ ```
125
+
126
+ ### 场景 2:日常开发
127
+
128
+ ```bash
129
+ # 使用开发环境配置
130
+ make env-dev
131
+
132
+ # 启动开发环境
133
+ pnpm run dev
134
+ ```
135
+
136
+ ### 场景 3:Docker 部署
137
+
138
+ ```bash
139
+ # 切换到生产环境
140
+ make env-prod
141
+
142
+ # 启动 Docker 容器
143
+ docker-compose up -d
144
+
145
+ # 查看日志
146
+ docker-compose logs -f
147
+ ```
148
+
149
+ ### 场景 4:敏感信息管理
150
+
151
+ ```bash
152
+ # 1. 创建本地配置文件
153
+ make env-local
154
+
155
+ # 2. 编辑 .env.local 添加敏感信息
156
+ nano .env.local
157
+
158
+ # 添加内容:
159
+ # DATABASE_URL=postgresql://user:pass@localhost:5432/db
160
+ # API_SECRET=your-secret-key
161
+ # JWT_SECRET=jwt-secret-key
162
+
163
+ # .env.local 会自动覆盖 .env 中的同名变量
164
+ ```
165
+
166
+ ---
167
+
168
+ ## 最佳实践
169
+
170
+ ### ✅ 推荐做法
171
+
172
+ 1. **始终使用 .env 文件**
173
+ ```bash
174
+ # 不要在代码中硬编码
175
+ const PORT = process.env.PORT || 3001 # ✅
176
+ const PORT = 3001 # ❌
177
+ ```
178
+
179
+ 2. **分离敏感信息**
180
+ ```bash
181
+ # .env - 非敏感配置(可以分享给团队)
182
+ NODE_ENV=development
183
+ PORT=3001
184
+ ENABLE_RATE_LIMIT=0
185
+
186
+ # .env.local - 敏感配置(个人使用)
187
+ DATABASE_URL=postgresql://localhost/db
188
+ API_KEY=secret-key-123
189
+ ```
190
+
191
+ 3. **提供 .env.example**
192
+ ```bash
193
+ # .env.example - 示例配置(提交到 Git)
194
+ NODE_ENV=development
195
+ PORT=3001
196
+ ENABLE_RATE_LIMIT=0
197
+ # API_KEY=your-api-key # 提供示例,不包含真实值
198
+ ```
199
+
200
+ 4. **使用环境前缀**
201
+ ```bash
202
+ # 命名规范
203
+ NSBP_NODE_ENV=development
204
+ NSBP_PORT=3001
205
+ NSBP_ENABLE_RATE_LIMIT=0
206
+ ```
207
+
208
+ ### ❌ 避免做法
209
+
210
+ 1. **不要提交 .env 到 Git**
211
+ ```bash
212
+ # .gitignore 已包含
213
+ .env
214
+ .env.local
215
+ .env.*.local
216
+ ```
217
+
218
+ 2. **不要在代码中硬编码敏感信息**
219
+ ```javascript
220
+ // ❌ 错误做法
221
+ const dbPassword = "my-password-123"
222
+
223
+ // ✅ 正确做法
224
+ const dbPassword = process.env.DB_PASSWORD
225
+ ```
226
+
227
+ 3. **不要在 .env.example 中包含真实值**
228
+ ```bash
229
+ # .env.example - 只提供示例
230
+ API_KEY=your-api-key-here # ✅
231
+ API_KEY=sk-1234567890abcdef # ❌
232
+ ```
233
+
234
+ ---
235
+
236
+ ## Docker Compose 集成
237
+
238
+ ### 自动读取 .env
239
+
240
+ Docker Compose 会自动读取项目根目录下的 `.env` 文件:
241
+
242
+ ```yaml
243
+ # docker-compose.yml
244
+ services:
245
+ app:
246
+ environment:
247
+ - NODE_ENV=${NODE_ENV:-production}
248
+ - PORT=${PORT:-3001}
249
+ - ENABLE_RATE_LIMIT=${ENABLE_RATE_LIMIT:-1}
250
+ ```
251
+
252
+ ### 使用方式
253
+
254
+ ```bash
255
+ # 1. 创建 .env 文件
256
+ cp .env.production .env
257
+
258
+ # 2. Docker Compose 自动读取
259
+ docker-compose up -d
260
+
261
+ # 3. 验证环境变量
262
+ docker-compose exec app env | grep NODE_ENV
263
+ ```
264
+
265
+ ---
266
+
267
+ ## 故障排除
268
+
269
+ ### 问题 1:环境变量未生效
270
+
271
+ **检查步骤:**
272
+ ```bash
273
+ # 1. 检查 .env 文件是否存在
274
+ ls -la .env
275
+
276
+ # 2. 查看文件内容
277
+ cat .env
278
+
279
+ # 3. 验证格式(等号两边不要有空格)
280
+ NODE_ENV=development # ✅
281
+ NODE_ENV = development # ❌
282
+
283
+ # 4. 重启服务
284
+ docker-compose restart
285
+ ```
286
+
287
+ ### 问题 2:敏感信息泄露
288
+
289
+ **预防措施:**
290
+ ```bash
291
+ # 1. 检查 .gitignore
292
+ cat .gitignore | grep .env
293
+
294
+ # 2. 验证文件未被提交
295
+ git ls-files | grep .env
296
+
297
+ # 3. 如果已提交,从历史记录中移除
298
+ git filter-branch --force --index-filter \
299
+ 'git rm --cached --ignore-unmatch .env'
300
+ ```
301
+
302
+ ### 问题 3:环境变量优先级混乱
303
+
304
+ **验证方法:**
305
+ ```bash
306
+ # 1. 显示容器中的环境变量
307
+ docker-compose exec app env | sort
308
+
309
+ # 2. 查看实际生效的值
310
+ docker-compose exec app sh -c 'echo $NODE_ENV'
311
+
312
+ # 3. 检查 .env.local 是否覆盖了预期值
313
+ cat .env.local | grep NODE_ENV
314
+ ```
315
+
316
+ ---
317
+
318
+ ## 常用命令速查
319
+
320
+ ```bash
321
+ # 查看当前配置
322
+ make show-env
323
+
324
+ # 切换开发环境
325
+ make env-dev
326
+
327
+ # 切换生产环境
328
+ make env-prod
329
+
330
+ # 创建本地配置
331
+ make env-local
332
+
333
+ # 查看容器环境变量
334
+ docker-compose exec app env
335
+
336
+ # 验证特定变量
337
+ docker-compose exec app sh -c 'echo $ENABLE_RATE_LIMIT'
338
+ ```
339
+
340
+ ---
341
+
342
+ ## 参考资源
343
+
344
+ - [Docker Compose 环境变量](https://docs.docker.com/compose/environment-variables/)
345
+ - [Node.js process.env](https://nodejs.org/api/process.html#process_process_env)
346
+ - [十二因子应用](https://12factor.net/)
@@ -0,0 +1,99 @@
1
+ # Docker 快速启动指南
2
+
3
+ 🌐 **Online Demo**: [https://nsbp.erishen.cn/](https://nsbp.erishen.cn/)
4
+
5
+ ## 5 分钟快速开始
6
+
7
+ ### 生产环境(推荐用于生产部署)
8
+
9
+ ```bash
10
+ # 1. 构建并启动
11
+ docker-compose up -d
12
+
13
+ # 2. 查看状态
14
+ docker-compose ps
15
+
16
+ # 3. 查看日志(可选)
17
+ docker-compose logs -f
18
+
19
+ # 4. 访问应用
20
+ open http://localhost:3001
21
+ ```
22
+
23
+ 完成!🎉
24
+
25
+ ### 开发环境(推荐用于开发)
26
+
27
+ ```bash
28
+ # 1. 构建并启动(前台运行,可查看构建日志)
29
+ docker-compose -f docker-compose.dev.yml up --build
30
+
31
+ # 2. 等待看到 "Server listening on port 3001"
32
+ # (首次启动需要 1-3 分钟进行构建)
33
+
34
+ # 3. 访问应用
35
+ open http://localhost:3001
36
+
37
+ # 4. 修改代码,自动热重载
38
+ ```
39
+
40
+ **提示:** 如果想在后台运行:
41
+ ```bash
42
+ docker-compose -f docker-compose.dev.yml up -d --build
43
+ docker-compose -f docker-compose.dev.yml logs -f
44
+ ```
45
+
46
+ ## 常用命令
47
+
48
+ ### 生产环境
49
+ ```bash
50
+ make prod # 启动
51
+ make logs # 查看日志
52
+ make restart # 重启
53
+ make down # 停止
54
+ make clean # 完全清理
55
+ ```
56
+
57
+ ### 开发环境
58
+ ```bash
59
+ make dev # 启动(带热重载)
60
+ make logs-dev # 查看日志
61
+ make restart-dev # 重启
62
+ ```
63
+
64
+ ### 通用
65
+ ```bash
66
+ make help # 查看所有命令
67
+ make shell # 进入生产容器
68
+ make shell-dev # 进入开发容器
69
+ ```
70
+
71
+ ## 验证安装
72
+
73
+ 检查 Docker 是否正确安装:
74
+ ```bash
75
+ docker --version
76
+ docker-compose --version
77
+ ```
78
+
79
+ 测试配置:
80
+ ```bash
81
+ ./scripts/verify-dev.sh
82
+ ```
83
+
84
+ ## 遇到问题?
85
+
86
+ - 查看 README.md 中的 Docker 部署章节
87
+ - 运行 `./scripts/verify-dev.sh` 验证开发环境状态
88
+ - 确保 Docker 守护进程正在运行
89
+
90
+ ## 目录说明
91
+
92
+ - `Dockerfile` - 生产环境镜像
93
+ - `Dockerfile.dev` - 开发环境镜像
94
+ - `docker-compose.yml` - 生产环境配置
95
+ - `docker-compose.dev.yml` - 开发环境配置
96
+ - `Makefile` - 快捷命令
97
+ - `scripts/verify-dev.sh` - 开发环境验证脚本
98
+ - `README.md` - 完整文档
99
+ - `QUICKSTART.md` - 本文档
@@ -3,9 +3,6 @@ Thumbs.db
3
3
 
4
4
  # Dependencies
5
5
  node_modules
6
- package-lock.json
7
- yarn.lock
8
- pnpm-lock.yaml
9
6
 
10
7
  # Build outputs
11
8
  build
@@ -1,21 +1,21 @@
1
1
  import React from 'react'
2
- import { loadData as homeLoadData } from './services/home'
3
- import { loadData as photoLoadData } from './services/photo'
2
+ import { loadData as homeLoadData } from '@services/home'
3
+ import { loadData as photoLoadData } from '@services/photo'
4
4
  import loadable from "@loadable/component"
5
5
 
6
6
  const Loading = () => {
7
7
  return <div>Loading...</div>
8
8
  }
9
9
 
10
- const Home = loadable(() => import("./containers/Home"), {
10
+ const Home = loadable(() => import("@containers/Home"), {
11
11
  fallback: <Loading />
12
12
  })
13
13
 
14
- const Login = loadable(() => import("./containers/Login"), {
14
+ const Login = loadable(() => import("@containers/Login"), {
15
15
  fallback: <Loading />
16
16
  })
17
17
 
18
- const Photo = loadable(() => import("./containers/Photo"), {
18
+ const Photo = loadable(() => import("@containers/Photo"), {
19
19
  fallback: <Loading />
20
20
  })
21
21
 
@@ -1,11 +1,11 @@
1
1
  import React, { useEffect, useState } from 'react'
2
2
  import { hydrateRoot } from 'react-dom/client'
3
3
  import { BrowserRouter, Routes, Route } from 'react-router-dom'
4
- import routers from '../Routers'
4
+ import routers from '@/Routers'
5
5
  import { Provider } from 'react-redux'
6
- import getStore from '../store'
7
- import { isSEO } from '../utils'
8
- import Theme from '../component/Theme'
6
+ import getStore from '@/store'
7
+ import { isSEO } from '@/utils'
8
+ import Theme from '@components/Theme'
9
9
  import { loadableReady } from '@loadable/component'
10
10
 
11
11
  const App = () => {
@@ -1,6 +1,6 @@
1
1
  import React from 'react'
2
2
  import { Link, useLocation } from 'react-router-dom'
3
- import { Container, LogoWrapper as Logo, Nav, NavLink, Brand } from '../styled/component/header'
3
+ import { Container, LogoWrapper as Logo, Nav, NavLink, Brand } from '@styled/component/header'
4
4
 
5
5
  const Header = () => {
6
6
  const location = useLocation()
@@ -1,9 +1,9 @@
1
1
  import express from 'express'
2
2
  import helmet from 'helmet'
3
3
  import rateLimit from 'express-rate-limit'
4
- import { render } from './utils'
5
- import { getPhotoWH, getPhotoMenu } from './photo'
6
- import { useCurrentFlag, outPhotoDicPath } from '../utils/config'
4
+ import { render } from '@server/utils'
5
+ import { getPhotoWH, getPhotoMenu } from '@server/photo'
6
+ import { useCurrentFlag, outPhotoDicPath } from '@utils/config'
7
7
 
8
8
  const app = express()
9
9
 
@@ -13,7 +13,22 @@
13
13
  "allowSyntheticDefaultImports": true,
14
14
  "esModuleInterop": true,
15
15
  "preserveConstEnums": true,
16
- "skipLibCheck": true
16
+ "skipLibCheck": true,
17
+ "baseUrl": ".",
18
+ "paths": {
19
+ "@/*": ["./src/*"],
20
+ "@components/*": ["./src/component/*"],
21
+ "@utils/*": ["./src/utils/*"],
22
+ "@services/*": ["./src/services/*"],
23
+ "@styled/*": ["./src/styled/*"],
24
+ "@store/*": ["./src/store/*"],
25
+ "@reducers/*": ["./src/reducers/*"],
26
+ "@containers/*": ["./src/containers/*"],
27
+ "@server/*": ["./src/server/*"],
28
+ "@client/*": ["./src/client/*"],
29
+ "@css/*": ["./src/css/*"],
30
+ "@externals/*": ["./src/externals/*"]
31
+ }
17
32
  },
18
33
  "include":[
19
34
  "./src/**/*",