Skip to content
On this page

痛点/ESM/0-1/css 工程化

痛点

  1. 模块化
  2. 兼容性(新语法,ts,css 预处理器)
  3. 生产性能问题
  4. 开发效率 图片.png

模块化

  1. 通过按顺序引入 script 标签
  2. 命名空间
ts
// module-a.js
window.moduleA = {
  data: "moduleA",
  method: function () {
    console.log("execute A's method");
  },
};
  1. IIFE

规范

  1. commonJS(require)
  2. AMD(define)
  3. SeaJS

    UMD 满足 AMD 和 commonJS(跨平台)

4.ESM

图片.png

跨平台

vite(0-1)

shell
pnpm create vite
bash
.
├── index.html
├── package.json
├── pnpm-lock.yaml
├── src
   ├── App.css
   ├── App.tsx
   ├── favicon.svg
   ├── index.css
   ├── logo.svg
   ├── main.tsx
   └── vite-env.d.ts
├── tsconfig.json
└── vite.config.ts

访问 localhost 请求 index.html,劫持文件,处理后(ts->js,less->css 等)再返回;返回后执行文件中的 import, 一个 import 就是一个 http 请求,相当于递归请求所有必要文件

配置

// vite.config.ts
import { defineConfig } from 'vite'
// 引入 path 包注意两点:
// 1. 为避免类型报错,你需要通过 `pnpm i @types/node -D` 安装类型
// 2. tsconfig.node.json 中设置 `allowSyntheticDefaultImports: true`,以允许下面的 default 导入方式
import path from 'path'
import react from '@vitejs/plugin-react'

export default defineConfig({
  // 手动指定项目根目录位置
  root: path.join(__dirname, 'src')
  plugins: [react()]
})

打包

图片.png

虽然 Vite 提供了开箱即用的 TypeScript 以及 JSX 的编译能力,但实际上底层并没有实现 TypeScript 的类型校验系统,因此需要借助 tsc 来完成类型校验(在 Vue 项目中使用 vue-tsc 这个工具来完成),在打包前提早暴露出类型相关的问题,保证代码的健壮性

现代 css 工程化

痛点

  1. 开发效率(不支持嵌套等)
  2. 样式污染
  3. 浏览器兼容
  4. 代码体积

方案

  1. css 预处理器
  2. css MOdule
  3. css 后处理器 PostCSS
  4. CSS in JS
  5. CSS 原子化框架

vite/css 配置

  1. 配置自动注入 scss 变量
ts
// vite.config.ts
import { normalizePath } from "vite";
// 如果类型报错,需要安装 @types/node: pnpm i @types/node -D
import path from "path";

// 全局 scss 文件的路径
// 用 normalizePath 解决 window 下的路径问题
const variablePath = normalizePath(path.resolve("./src/variable.scss"));

export default defineConfig({
  // css 相关的配置
  css: {
    preprocessorOptions: {
      scss: {
        // additionalData 的内容会在每个 scss 文件的开头自动注入
        additionalData: `@import "${variablePath}";`,
      },
    },
  },
});
  1. CSS Modules

图片.png

  1. PostCSS
// vite.config.ts 增加如下的配置
import autoprefixer from 'autoprefixer';

export default {
 css: {
   // 进行 PostCSS 配置
   postcss: {
     plugins: [
       autoprefixer({
         // 指定目标浏览器
         overrideBrowserslist: ['Chrome > 40', 'ff > 31', 'ie 11']
       })
     ]
   }
 }
}

图片.png

  1. CSS In JS
// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    react({
      babel: {
        // 加入 babel 插件
        // 以下插件包都需要提前安装
        // 当然,通过这个配置你也可以添加其它的 Babel 插件
        plugins: [
          // 适配 styled-component
          "babel-plugin-styled-components"
          // 适配 emotion
          "@emotion/babel-plugin"
        ]
      },
      // 注意: 对于 emotion,需要单独加上这个配置
      // 通过 `@emotion/react` 包编译 emotion 中的特殊 jsx 语法
      jsxImportSource: "@emotion/react"
    })
  ]
})
  1. CSS 原子化框架

图片.png 除了本身的原子化 CSS 能力,Windi CSS 还有一些非常好用的高级功能,在此我给大家推荐自己常用的两个能力: attributifyshortcuts

jsx
<button
  bg="blue-400 hover:blue-500 dark:blue-500 dark:hover:blue-600"
  text="sm white"
  font="mono light"
  p="y-2 x-4"
  border="2 rounded blue-200"
>
  Button
</button>
jsx
<div className="flex-c"></div>
<!-- 等同于下面这段 -->
<div className="flex justify-center items-center"></div>

Tailwind 配置