# 前端技术选型

# 同构架构

同构架构:

部署相关: 涉及服务端和客户端的统一部署策略
开发相关: 包含了几个重要的技术栈和模式

Nest.js: Node.js 的服务器端框架
NEXT规则: Next.js的开发规范
DI(依赖注入): 一种软件设计模式
MVC: Model-View-Controller架构模式

# SPA 架构

SPA(单页应用)架构:

MVC架构模式的实现
文件目录组织结构
SOLID原则
DI(依赖注入)的应用
"在现代Web开发中,我们主要用到两种架构模式:

1. 同构架构的优势:
- 提供更好的首屏加载体验
- 有利于SEO优化
- 代码可以在服务器和客户端复用
- 使用Nest.js和Next.js这样的成熟框架可以快速搭建

2. SPA架构的特点:
- 提供流畅的用户体验
- 前后端分离,关注点分离
- 遵循SOLID原则保证代码质量
- 使用依赖注入(DI)提高代码的可维护性和可测试性

在实践中,我们会根据具体业务需求选择合适的架构方案,比如:
- 内容展示型网站偏向使用同构架构
- 交互密集型应用偏向使用SPA架构
- 也可以根据需要做混合架构"

tree

# 技术选型

# DOM 库 (opens new window)

pnpm + vite 创建项目


// 安装
pnpm create vite solid-app --template solid-ts

# Solid
pnpm --filter solid-app add -D vite vite-plugin-solid
# 测试某个具体项目
pnpm --filter react-app dev

alt text

Jquery

React

# htmlx

alt text

# htmlx 和amp共同点与区别

  • HTML拓展属性使用
<!-- HTMX 示例 -->
<div hx-get="/api/data" hx-trigger="click">
    点击加载数据
</div>

<!-- AMP 示例 -->
<amp-img src="image.jpg" width="800" height="600" layout="responsive">
</amp-img>
  • 声明式开发
<!-- HTMX 声明式交互 -->
<button 
    hx-post="/api/like"
    hx-trigger="click"
    hx-swap="outerHTML"
>
    点赞
</button>

<!-- AMP 声明式组件 -->
<amp-carousel width="400" height="300" layout="responsive" type="slides">
    <div>第一页</div>
    <div>第二页</div>
</amp-carousel>
使用场景:


HTMX:

适合构建交互式 Web 应用

注重服务器端集成

更灵活的开发方式


AMP:

专注于移动页面加载性能

严格的技术规范

主要用于发布内容




技术特点:


HTMX:

无需特殊构建过程

可以与任何后端技术配合

更自由的开发模式


AMP:

需要特定的 AMP 验证

有严格的代码限制

需要特定的 AMP 组件




性能优化:


HTMX:

通过减少 JavaScript 代码量优化

依赖服务器端处理

按需加载内容


AMP:

严格的性能规则

预加载资源

CDN 缓存支持




开发复杂度:


HTMX:

学习曲线较平缓

容易集成到现有项目

更接近传统 Web 开发


AMP:

需要遵循严格规范

有特定的开发限制

需要专门的验证工具



选择建议:

如果需要构建交互式 Web 应用,选择 HTMX

如果需要优化移动端内容展示,选择 AMP

可以在同一个项目中结合使用两者,针对不同场景选择合适的技术

# pwa

alt text

开发的应用

service worker 离线缓存

workbox-webpack

# Million (opens new window)

这个比较重要

# 为什么使用typeScript

ts 提前 做了类型检查 v8 字节码 机器码

类型检查的意义:TypeScript 的提前类型检查能有效减少运行时的错误风险,确保代码更加健壮、易于维护。 V8 的字节码和机器码:V8 引擎通过字节码和 JIT 编译实现了高效的 JavaScript 执行,结合 TypeScript 能进一步提升开发体验和代码的可维护性。

TypeScript 和 V8 的配合:TypeScript 编译成 JavaScript 后,V8 引擎将其高效执行,前端开发因此可以享受静态类型的安全性和动态执行的性能。

# quicktype

cli RESTful API 调用quicktype 生成接口类型 类型声明 在全队fetch时候 responced type 就不需要人来管理了

# yarn npm 和pnpm 对比

alt text

alt text

alt text

# Solid

alt text

初始化项目 不使用虚拟dom js facch 回来 还要转成虚拟dom v8序列化这套js 需要耗时 页面渲染不了

当年 quiker 提出来 不调和 不水合 这件事

# 构建工具

# webpack

整个站点 commonjs 规范 SWC/EsBuild babel不能使用了

# cli工具

基于项目二次封装

CRA

Vue-cli

# SWC/ESbuild/RSPack

esbuild 和 SWC 都是 JavaScript 和 TypeScript 的高性能构建和编译工具,具有相似的目标但不同的设计和实现方式:

  1. esbuild

简介:esbuild 是一个用 Go 编写的 JavaScript/TypeScript 打包器,因其极高的速度和效率而出名。

特点:

速度:由于采用 Go 语言并行编译机制,esbuild 的性能极高,常常比 JavaScript 写的工具快几十倍。

Bundling(打包):支持将多文件的依赖图打包为单个文件,方便前端部署。

Tree Shaking:会自动移除未使用的代码以减小打包大小。

兼容性:支持现代的 JavaScript 和 TypeScript,且可以转换为 ES5 等兼容旧浏览器的版本。

配置简单:设计的初衷就是为了简化构建过程,默认配置就能处理大部分常见需求。

应用场景:适合构建速度要求高、兼容性要求不复杂的项目,尤其在开发环境下更能体现其性能优势。

  1. SWC (Speedy Web Compiler)

简介:SWC 是用 Rust 编写的 JavaScript/TypeScript 编译器,主要用于编译和转译代码。

特点:

速度:Rust 的低层实现提供了接近原生的编译速度,特别是在多核 CPU 上表现优异。

支持现代语法:支持最新的 JavaScript 和 TypeScript 特性,并提供丰富的兼容选项。

插件系统:SWC 支持通过插件定制编译过程,虽然不像 Babel 那样成熟,但也在不断完善。

生态集成:SWC 被 Next.js 等框架采用来加速构建流程。

应用场景:SWC 更偏向于代码转译(transpiling),适合追求编译速度的项目,在大型代码库和复杂语法转换中优势显著。

对比

性能:两者在性能上都非常出色,SWC 通常在编译上稍快,而 esbuild 则在整体打包上表现更优。

生态与插件:esbuild 的生态和配置系统较简单,而 SWC 更接近 Babel 的插件体系,便于复杂场景下的拓展。

适用性:esbuild 常用作构建工具(bundler),SWC 更适合在代码转换(transpiler)方面的应用。

总之,esbuild 和 SWC 都可以极大地提升 JavaScript/TypeScript 项目的构建速度,esbuild 更适合作为打包器使用,而 SWC 则适合作为高性能的编译器来处理代码转换。

# viet

koa + esbuild

# Parcel

Parcel 是一个零配置的 Web 应用打包工具,以快速启动和简便的配置著称。Parcel 会自动检测和处理依赖关系,无需额外配置,并内置支持 TypeScript、JSX、CSS 和其他文件类型。

马上启动开发环境

TS SDK 迅速去Docs

# Rollup

开发sdk 生成UMD AMD CMD EsModule 规范

Vite:适合构建现代前端应用,提供极速开发体验。 Parcel:零配置的打包工具,适合快速启动前端项目。 Rollup:适合构建库,提供模块化和代码优化的打包方式。

# CSS

# css module

# less/sass

# CSS in js

# Style components

Style Components (opens new window)

# emotion

emotion (opens new window)

import { css } from '@emotion/css'

const color = 'white'

render(
  <div
    className={css`
      padding: 32px;
      background-color: hotpink;
      font-size: 24px;
      border-radius: 4px;
      &:hover {
        color: ${color};
      }
    `}
  >
    Hover to change color.
  </div>
)

# css in js

# css next (opens new window)

# CSS 函数

# 数学计算函数

.element {
  /* calc() - 基础数学计算 */
  width: calc(100% - 20px);
  
  /* min() - 取最小值 */
  width: min(50%, 500px);
  
  /* max() - 取最大值 */
  width: max(50%, 300px);
  
  /* clamp() - 值的范围限定 (MIN, VAL, MAX) */
  width: clamp(200px, 50%, 800px);
}

# 颜色函数

.element {
  /* RGB颜色 */
  color: rgb(255, 0, 0);
  color: rgba(255, 0, 0, 0.5);
  
  /* HSL颜色 */
  color: hsl(0, 100%, 50%);
  color: hsla(0, 100%, 50%, 0.5);
  
  /* 颜色混合 */
  background: color-mix(in srgb, #34c9eb 25%, white);
  
  /* 相对颜色改变 */
  color: color-contrast(white);
  
  /* 当前颜色 */
  border-color: currentColor;
}

# 自定义属性函数

.element {
  /* var() - 使用CSS变量 */
  color: var(--main-color, #000);
  
  /* env() - 环境变量 */
  padding-bottom: env(safe-area-inset-bottom);
  
  /* 属性引用 */
  content: attr(data-label);
}

# 变换和过滤函数

.element {
  /* 变换函数 */
  transform: translate(50px, 100px);
  transform: rotate(45deg);
  transform: scale(1.5);
  transform: skew(10deg);
  transform: matrix(1, 0, 0, 1, 0, 0);
  
  /* 过滤函数 */
  filter: blur(5px);
  filter: brightness(150%);
  filter: contrast(200%);
  filter: grayscale(50%);
  filter: hue-rotate(90deg);
  filter: invert(75%);
  filter: opacity(50%);
  filter: saturate(30%);
  filter: sepia(60%);
}

# 渐变函数

.element {
  /* 线性渐变 */
  background: linear-gradient(to right, red, blue);
  
  /* 径向渐变 */
  background: radial-gradient(circle, red, blue);
  
  /* 圆锥渐变 */
  background: conic-gradient(from 45deg, red, blue);
  
  /* 重复渐变 */
  background: repeating-linear-gradient(45deg, red 0%, blue 10%);
}

# 网格和布局函数

.container {
  /* repeat() */
  grid-template-columns: repeat(3, 1fr);
  
  /* minmax() */
  grid-template-columns: minmax(100px, 1fr);
  
  /* fit-content() */
  width: fit-content(300px);
}

# 图形函数

.element {
  /* clip-path */
  clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
  
  /* path() */
  clip-path: path('M0,0 L100,0 L100,100 L0,100 Z');
  
  /* shape-outside */
  shape-outside: circle(50%);
}

# 滤镜和混合模式

.element {
  /* 背景混合 */
  background-blend-mode: multiply;
  
  /* 混合模式 */
  mix-blend-mode: overlay;
  
  /* 高级滤镜 */
  backdrop-filter: blur(10px) brightness(80%);
}

# 动画和时间函数

.element {
  /* 步进函数 */
  transition-timing-function: steps(4, end);
  
  /* 贝塞尔曲线 */
  animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}

# 视觉效果函数

.element {
  /* 投影 */
  box-shadow: drop-shadow(2px 2px 2px rgba(0, 0, 0, 0.5));
  
  /* 混合 */
  background-image: cross-fade(url(image1.jpg), url(image2.jpg), 50%);
}

# CSS 伪类选择器

# 基础结构性伪类
/* 第一个和最后一个 */
:first-child     /* 第一个子元素 */
:last-child      /* 最后一个子元素 */
:only-child      /* 唯一的子元素 */
:first-of-type   /* 第一个特定类型的元素 */
:last-of-type    /* 最后一个特定类型的元素 */
:only-of-type    /* 唯一的特定类型元素 */

/* 示例 */
li:first-child {
  font-weight: bold;
}
p:first-of-type {
  font-size: 1.2em;
}

# 位置相关伪类

/* nth选择器 */
:nth-child(n)        /* 第n个子元素 */
:nth-last-child(n)   /* 倒数第n个子元素 */
:nth-of-type(n)      /* 第n个特定类型元素 */
:nth-last-of-type(n) /* 倒数第n个特定类型元素 */

/* 常用公式 */
:nth-child(odd)      /* 奇数位置 */
:nth-child(even)     /* 偶数位置 */
:nth-child(3n)       /* 每3个 */
:nth-child(3n+1)     /* 每3个后的第1个 */

/* 示例 */
tr:nth-child(even) {
  background-color: #f2f2f2;
}

li:nth-child(3n+1) {
  margin-left: 0;
}

# 状态相关伪类

/* 表单状态 */
:disabled    /* 禁用状态 */
:enabled     /* 可用状态 */
:checked     /* 选中状态 */
:required    /* 必填项 */
:optional    /* 选填项 */
:valid       /* 验证通过 */
:invalid     /* 验证失败 */
:in-range    /* 在范围内 */
:out-of-range/* 超出范围 */

/* 链接状态 */
:link        /* 未访问链接 */
:visited     /* 已访问链接 */
:hover       /* 鼠标悬停 */
:active      /* 激活状态 */
:focus       /* 获得焦点 */
:focus-within/* 子元素获得焦点 */
:focus-visible/* 键盘焦点可见 */

/* 示例 */
input:invalid {
  border-color: red;
}

button:hover {
  background-color: #0056b3;
}

# 内容相关伪类

:empty              /* 空元素 */
:target             /* 当前锚点目标 */
:lang(language)     /* 特定语言 */
:not(selector)      /* 否定选择器 */
:is(selector)       /* 匹配任意选择器 */
:where(selector)    /* 零优先级的组合 */
:has(selector)      /* 包含特定元素 */

/* 示例 */
p:empty {
  display: none;
}

:not(.active) {
  opacity: 0.5;
}

# 复杂选择器组合

/* 多条件组合 */
input:enabled:hover {
  border-color: blue;
}

/* 否定组合 */
.item:not(:first-child):not(:last-child) {
  margin: 0 10px;
}

/* 状态组合 */
.button:hover:not(:disabled) {
  transform: scale(1.05);
}

# Less/Sass

优点:
- 提供变量、嵌套、混合、函数等编程能力
- 代码复用性强,维护方便
- 兼容普通 CSS,学习成本较低

缺点:
- 需要编译步骤,增加构建时间
- 代码可能会冗余
- 运行时无法动态修改变量

# css module

优点:
- 局部作用域,解决命名冲突
- 与组件化开发契合
- 编译时生成唯一类名,无运行时开销

缺点:
- 不能动态修改样式
- 需要构建工具支持
- 全局样式需要特殊处理 
没有对应的函数 和方法 

# css in js


优点:
- 完全组件化,样式跟随组件
- 支持动态样式计算
- 运行时生成样式,更灵活

缺点:
- 运行时开销较大
- 增加打包体积
- 部分方案需要额外学习成本

# Styled Components

// 1. 基础用法
import styled from 'styled-components';

const Button = styled.button`
  background: ${props => props.primary ? 'blue' : 'white'};
  color: ${props => props.primary ? 'white' : 'blue'};
  padding: 10px 20px;
`;

// 使用
<Button primary>Click me</Button>

# emotion

import { css } from '@emotion/css'

const style = css`
  background-color: hotpink;
  &:hover {
    color: white;
  }
`

// 使用
<div className={style}>This has a hotpink background.</div>

# Styletron (opens new window)


Styletron 是一个高性能的 CSS-in-JS 解决方案,具有以下主要特点:

原子化 CSS

    自动将样式拆分为最小单位
    实现最大程度的样式复用
    减少生成的 CSS 大小


性能优势

    虚拟 CSS 引擎
    自动去重
    按需加载样式

# js in css

既想css 有js 的能力 ,又想css样式分离,衍生了js in css JS in CSS 指的是在 CSS 中直接使用 JavaScript 的能力,主要通过 CSS Houdini API 实现。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      /* 定义CSS变量 */
      :root {
        --zhijia: "Hello CSS Variable";
      }

      /* 使用CSS变量 */
      a::before {
        content: var(--zhijia);
      }

      /* 基础样式 */
      a {
        position: relative;
        margin: 20px;
      }
    </style>
  </head>
  <body>
    <a>这个css in js</a>

    <!-- 如果你想要使用JavaScript来动态修改CSS变量 -->
    <script>
      // 方法1:直接设置CSS变量
      //   document.documentElement.style.setProperty("--zhijia", '"Updated Value"');

      // 方法2:通过JavaScript函数动态更新内容
      //   function updateContent() {
      //     const root = document.documentElement;
      //     root.style.setProperty("--zhijia", '"Dynamic Content"');
      //   }
    </script>
  </body>
</html>

# Houdini API 介绍

alt text

alt text

  • CSS Parser API
// CSS 解析器 API
主要功能:
- 允许开发者扩展 CSS 词法分析器
- 可以解析新的CSS语法结构
- 支持新的媒体查询规则、@extends、@apply等

实例:
// 注册新的CSS自定义属性
CSS.registerProperty({
  name: '--my-color',
  syntax: '<color>',
  inherits: false,
  initialValue: '#c0ffee'
});

  • CSS Layout API
// 布局 API
主要功能:
- 允许开发者创建自定义布局模块
- 类似于 display: flex 或 display: grid
- 可以实现完全自定义的布局算法

示例:
registerLayout('masonry', class {
  static get inputProperties() {
    return ['width', 'height'];
  }
  
  async layout(children, edges, constraints, styleMap) {
    // 自定义布局逻辑
    return {
      childrenSizes: sizes,
      autoBlockSize: height
    };
  }
});
  • CSS Paint API
// 绘制 API
主要功能:
- 提供类似Canvas的绘制能力
- 可以创建自定义背景、边框等视觉效果
- 通过registerPaint注册自定义绘制方法

示例:
registerPaint('circlePattern', class {
  paint(ctx, size, properties) {
    // 使用Canvas API进行绘制
    ctx.fillStyle = 'red';
    ctx.beginPath();
    ctx.arc(size.width/2, size.height/2, 50, 0, 2 * Math.PI);
    ctx.fill();
  }
});
  • CSS Worklets
// 工作线程
主要功能:
- 允许在渲染流程中执行JavaScript
- 可以创建高性能的动画和效果
- 支持自定义绘制和布局操作

使用方式:
// 加载绘制worklet
CSS.paintWorklet.addModule('my-paint-worklet.js');

// 加载布局worklet
CSS.layoutWorklet.addModule('my-layout-worklet.js');

# css-doodle

<css-doodle>
  :doodle {
    @grid: 5x5;    /* 创建5x5的网格 */
  }
  background: @pick(#ff0000, #00ff00, #0000ff);  /* 随机选择颜色 */
</css-doodle>

# type om object

  • 主要概念和类型:
    • CSSStyleValue:所有 CSS 值的基类

    • CSSKeywordValue: 关键字值(如 'auto', 'none')

    • CSSUnitValue: 带单位的数值(如 '42px')

    • CSSMathValue: 计算表达式

    • CSSTransformValue: 变换值

    • CSSImageValue: 图片值

// 1. 基础属性访问和设置
const element = document.querySelector('.example');

// 传统方式
element.style.opacity = '0.5';
console.log(element.style.opacity); // "0.5" (字符串)

// Typed OM 方式
element.attributeStyleMap.set('opacity', 0.5);
console.log(element.attributeStyleMap.get('opacity').value); // 0.5 (数字)

// 2. 数值计算和单位转换
// 创建CSS数值
const width = CSS.px(42);
const height = CSS.vw(50);
const margin = CSS.rem(1.2);

// 数值运算
const calc = CSS.px(100).add(CSS.vw(50));
console.log(calc.toString()); // "calc(100px + 50vw)"

// 3. 使用 CSSStyleValue 创建样式
const color = new CSSKeywordValue('red');
const padding = new CSSUnitValue(5, 'px');
const transform = new CSSTransformValue([
  new CSSTranslate(CSS.px(100), CSS.px(200))
]);

// 4. 批量设置样式
element.attributeStyleMap.set('width', CSS.px(200));
element.attributeStyleMap.set('height', CSS.px(100));
element.attributeStyleMap.set('background-color', new CSSKeywordValue('blue'));

// 5. 读取计算样式
const computedStyles = document.querySelector('.example').computedStyleMap();
console.log(computedStyles.get('width').value); // 获取计算后的宽度值
console.log(computedStyles.get('color').toString()); // 获取计算后的颜色值

// 6. 处理复杂值
// Transform 示例
const transformValue = new CSSTransformValue([
  new CSSRotate(CSS.deg(45)),
  new CSSScale(1.5, 1.5),
  new CSSTranslate(CSS.px(100), CSS.px(0))
]);
element.attributeStyleMap.set('transform', transformValue);

// 7. 自定义属性处理
CSS.registerProperty({
  name: '--my-color',
  syntax: '<color>',
  inherits: false,
  initialValue: '#c0ffee'
});

// 8. 数值验证
try {
  element.attributeStyleMap.set('opacity', CSS.number(2)); // 抛出错误,opacity 必须在 0-1 之间
} catch (e) {
  console.error('Invalid opacity value');
}

# 原子css

# Css Next (opens new window)

CSS Next (现在也叫 PostCSS Preset Env),这是一个允许你使用未来 CSS 特性的工具。

精通 Atomic state 与 css

# postcss tailWindcss


PostCSS 和 Tailwind CSS 的关系
PostCSS:

是一个 CSS 处理工具,可以通过插件执行各种任务,如自动添加浏览器前缀、压缩 CSS 等。
PostCSS 本身没有特定功能,它是一个插件运行平台,根据项目需要加载特定的插件进行处理。
Tailwind CSS:

是一个实用优先的 CSS 框架,提供大量的预定义类来快速构建 UI。
Tailwind 使用 PostCSS 进行编译,因为它自身通过 PostCSS 插件来生成并处理工具类。
两者协同工作:

在使用 Tailwind CSS 时,PostCSS 作为插件管理器将 Tailwind 插入到项目的 CSS 构建流程中。
Tailwind CSS 提供的插件(@tailwindcss)将生成工具类和必要的样式,同时其他 PostCSS 插件可以继续处理生成的 CSS。

css不回来 js 执行不了

# 状态库

# 组件内状态

# mobx

# useReducer

# Content

# Jotai

immer

alt text

alt text

why did you render [简历]

# Recoil

原子状态

# 组件外状态

# Redux

# zustand

# 前端架构方案

# 组件库

兼容css 方案

# 私仓

# lerna

# Rush

# pnpm

# turbor epo

rust

# 性能监控平台

线上用户行为回溯 用户错误预警

# 工程提效

css 硬件加速

编译

ci/cd

重复检查

cli工具

# 团队特色

低代码

微前端

微服务

# 跨界

# RN

# IOT

# VR/AR 方案

# 端内方案

# 图形学

webpack

typeScript

Cocos 2d

phaser 2d

Babylon

webGIS

出U到港币存汇丰,然后转到中银香港,在大陆提人民币 花滑点最少

hash chunkhash

# 配置 Tailwind CSS

css-loader 处理css 文件
postcss-loader 处理tailwind 语句