Skip to main content

4月10日内容汇总

· 7 min read
加菲猫

📒 编译 ts 代码用 tsc 还是 babel

📒 第三方库是否应该提交 lockfile

在业务项目中,每次依赖安装的版本号都从 lock 文件中进行获取,锁定依赖和依赖的依赖,避免了不可测的依赖风险。但是仍然存在间接依赖不可控的问题,例如 React 依赖 object-assign,在 React 中 lockfile 锁定的版本为 object-assign@4.1.0,但是前端项目实际安装的版本为 object-assign@4.99.99

  • 第三方库的 devDependencies 必须锁定,这样 Contributor 可根据 lockfile 很容易将项目跑起来
  • 第三方库的 dependencies 虽然有可能存在不可控问题,但是可通过锁死依赖或者勤加更新的方式来解决

如果没有 package-lock.json,那将如何

📒 工程化知识卡片 023:node_modules 版本重复的困境

npmv3 之后 node_modules 为平铺结构,但是仍然存在依赖重复安装的问题。

工程化知识卡片 023:node_modules 版本重复的困境

📒 Vue 开发小技巧

分享 15 个 Vue3 全家桶开发的避坑经验

vue3中可以帮助你早点下班的9个开发技巧

📒 【混淆系列】三问:npx、npm、cnpm、pnpm区别你搞清楚了吗?

📒 Webpack组件库打包超详细指南

📒 Node.js 技术架构

Node 是怎么实现的?简言之:用 V8 运行 JS、用 bindings 实现 JS 与 C/C++ 沟通、用 C/C++ 库高效处理 IO、用 Node.js 标准库简化 JS 代码、用 Event Loop 管理事件处理顺序、用 libuv 实现异步 I/O 操作。

Node.js 技术架构

📒 Web 框架的替代方案

📒 写好 JavaScript 异步代码的几个推荐做法

📒 Node.js 进阶 - 多文件 Stream 合并,串行和并发两种模式实现

重要的事情再说一遍,pipe 方法默认情况下会自动关闭可写流,但是如果可读流期间发生错误,则写入的目标流将不会关闭,所以如果使用 pipe 需要监听错误事件,手动关闭可写流,防止文件句柄泄露。

Node.js 进阶 - 多文件 Stream 合并,串行和并发两种模式实现

📒 服务端渲染SSR及实现原理

📒 手摸手服务端渲染-react

📒 如何在项目中用好 TypeScript

📒 Golang 和 JS 创建对象方式对比

Golang 与 JS 创建对象非常类似,Golang 在创建对象的时候需要定义 schema 进行类型约束:

type Person struct {
Name string
Age int
Sex bool
}

person := Person{
Name: "dbydm",
Age: 12,
Sex: true,
}

Golang 创建对象数组:

list := []*Person{
&Person{
Name: "dbydm",
Age: 12,
Sex: true,
},
&Person{
Name: "dm",
Age: 2333,
Sex: false,
},
}

📒 Node.js 常见的系统信号

  • SIGHUP:不通过 ctrl+c 停止进程,而是直接关闭命令行终端,会触发该信号
  • SIGINT:按下 ctrl+c 停止进程时触发;pm2 重启或者停止子进程时,也会向子进程发送该信号
  • SIGTERM:一般用于通知进程优雅退出,如 k8s 删除 pod 时,就会向 pod 发送 SIGTERM 信号,pod 可以在超时时间内(默认 30s)做一些退出清理动作
  • SIGBREAK:在 window 系统上,按下 ctrl+break 会触发该信号
  • SIGKILL:强制退出进程,进程无法做任何清理动作,执行命令 kill -9 pid,进程会收到该信号。k8s 删除 pod 时,如果超过 30s,pod 还没退出,k8s 会向 pod 发送 SIGKILL 信号,立即退出 pod 进程;pm2 在重启或者停止进程时,如果超过 1.6s,进程还没退出,也会发送 SIGKILL 信号

📒 2022 年,Babel vs TypeScript,谁更适合代码编译

📒 React 常用状态管理库

  • Redux
  • Mobx
  • Recoil
  • Hookstate
  • Rematch
  • Jotai
  • Zustand

📒 从源码理清 useEffect 第二个参数是怎么处理的

📒 腾讯一面:CORS为什么能保障安全?为什么只对复杂请求做预检?

📒 如何在 Node 环境使用 ESM 模块规范

首先明确一点,Node 环境并非不支持 ESM 规范,只是没有启用而已,默认使用 CJS 规范,可通过如下方式启用:

  • 单文件使用 ESM 规范,可以将该文件后缀改为 .mjs
  • 整个工程使用 ESM 规范,可以在 package.json 中配置 "type": "module"

假如不想通过上述方式启用,还有一些方法:

  • 通过 Webpack 等打包工具支持 ESM 模块(Webpack 默认使用 web 环境构建,需要配置 target: "node" 避免打包 Node 内置模块);
  • 还可以使用 ts-nodejiti 等 runtime 支持 ESM 模块(内部使用 tsc 或者 babel 进行编译);

📒 如何生成随机 ID

一种是直接使用 Math.random()

const randomId = () => Math.random().toString().slice(2, 8);

另一种是使用查表的方式:

// 生成 [0..9] 的数组
const nums = Array.from({ length: 10 }, (_, index) => index);

// 从 nums 数组中随机选取元素
const sample = (arr) => arr[Math.floor(Math.random() * arr.length)];
const randomId = () => Array.from({ length: 6 }, () => sample(nums)).join("");

📒 跨域如何携带 Cookie

  • 如果通过网关层代理(例如 nginx)则不用担心,对于浏览器来说实际上并没有跨域,可正常携带 Cookie
  • 如果通过 CORS 跨域,浏览器默认不会携带 Cookie,此时有两种方案:
    • 在请求头中添加 Authorization 字段发送 Cookie(在 axios 中配置请求拦截添加)
    • 后端响应头添加 Access-Control-Allow-Credentials,前端发送请求时配置 xhr.withCredentials = true