这篇笔记录了我在使用Node.js, TypeScript 和 React.js 搭建全栈项目所遇到的一系列问题和我的解决方案. 很多方案目的只是解决面临的问题, 很可能不是最优策略, 仅供参考.
- 该项目技术栈
- 配置后端Typescript, 启用ES6模块, 以及模块导入
- Node连接不了云端的Mongo Atlas数据库, 显示无法找到primary cluster
- .env 变量无法正确被读取
- 导入模块css后得到undefined
- 在storybook中启用模块css
- 应用初始化时, 应用整体被挂载两次
该项目技术栈
该项目使用以下技术栈进行搭建:
- Typescript
- Node.js
- Express.js
- MongoDB
- React.js
- Redux: 用于管理React状态
- Storybook: 用于协同, 隔离和可视化前端组件开发和测试, 以及自动生成文档
配置后端Typescript, 启用ES6模块, 以及模块导入
在tsconfig.json
中启用如下设置:
1 | { |
并且在导入模块时使用完整后缀名:
1 | import ExpenseModel from '../model/expense.model.ts' |
我在后端项目中选择了这么配置, 但是由于前端使用webpack打包而后端使用tsc 打包, 两者在设置上有一些不同, 导致模块导入的写法在前后端不一致, 应该可以有一个更好的解决方法
Node连接不了云端的Mongo Atlas数据库, 显示无法找到primary cluster
在链接Mongo Atlas 时, 即使使用了正确的链接串也无法使用node链接, 但是无论是shell和MongoDB Compass 都可以正常连接.
这可能是由于无论是Node MongoDB Driver 还是 mongoose, 都不默认开启tls. 在配置中显式启用tls 即可.
1 | import mongoose from 'mongoose'; |
.env 变量无法正确被读取
在.env 定义变量之后, ts编译阶段无法被读取. 原因为dotenv需要再最开始就调用来读取环境变量, 在启动应用的其他部分
在网上找到一些解决方案, 比如在应用入口最开始导入dotenv:
1 | // index.ts |
但是不知为什么, 这对我无效.
我的解决方案是单独创建一个模块用于导入环境变量, 然后其他模块导入这个模块来获得环境变量:
1 | // config/envronment.ts |
导入模块css后得到undefined
配置webpack:
首先, 在resolve
处添加.css
后缀来允许webpack 解析css文件:
1 | resolve: { |
在确保已经下载css-loader
和 style-loader
后, 在webpack 中配置rules:
1 | module: { |
确保.module.css
的规则设置在.css
前, 以避免模块css的规则被覆盖.
在项目根目录, 也就是在tsconfig.json
中设置在include:
选项中的文件夹, (一般是src
文件夹)中添加声明文件:
1 | // declaration.d.ts |
最后, 对导入的写法从直接导入改为命名空间导入:
1 | // 直接导入写法 (这种写法在我的项目里无法识别) |
在storybook中启用模块css
在上面我们成功在webpack 启用模块css 之后, 由于我们仅仅更改了我们项目的webpack配置, 而storybook 使用自己的webpack, 所以我们也需要对storybook 进行配置.
在.storybook
路径下的main.ts
中进行如下配置:
1 | import type { StorybookConfig } from "@storybook/react-webpack5"; |
应用初始化时, 应用整体被挂载两次
期初发现这个bug 的原因是因为我的页面组件的useEffect
钩子总是在页面加载后连续触发两次, 一开始我以为是React的组件生命周期问题, 在网络上查找后, 发现这一现象的普遍原因是因为React 18 后 React.StricMode
带来的, 只在开发环境中出现. 但是经过我的测试, 我发现在我的应用中, 该现象也会在生产构建后的应用中出现.
我的下一步调试, 是在App.tsx
中添加useEffect
钩子, 以及在index.tsx
中添加调试代码, 来判断具体的双重挂载到底是发生在那一层中, 最后发现, 我的所有应用从最顶层都会执行两次, 这就和网络上大多数人遇到相同表现的问题本质不同了.
最后, 我的问题出在我的index.html 模板中:
在webpack.config
中, 我添加了插件HtmlWebpackPlugin
:
1 | plugins: [ |
其作用就是以我提供的html
文件作为模板, 在打包的时候注入我的TypeScript脚本, 也就是说, 该插件会主动注入 <script src="bundle.js"></script>
, 而我的index.html
模板中, 我手动编写了<script src="bundle.js"></script>
, 这就导致最后脚本会运行两遍
解决方法:
1 |
|
- 本文作者: Depasinre
- 本文链接: https:/Depasinre.github.io/2025/01/03/TypeScript-Node-React-Project-Problem-Collection/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!