Vite-进阶知识

2022/2/21 Vite
// Vite 中的编译工具
1. 在开发环境时使用了 ESbuild
2. 在线上环境时使用了 Rollup
----------------------------------------------------------------------------------------------
// Rollup
1. 默认支持 Tree Shaking,且推荐使用 ESM 的模块规范
2. 正常命令行的参数都有全拼和缩写功能
  1. rollup --version === rollup -v
  2. rollup --help === rollup -h
3. 更多命令
  // -i 是 --input 的缩写,即入口的意思
  1. rollup -i index.js --file dist.js --format cjs // 入口文件是 index.js,编译后的文件名是 dist.js,以 cjs 模式编译
  2. rollup -i a.js -i b.js --dir dist // 同时编译两个文件,编译输出到 dist 文件夹下
  3. rollup -i index.js --format iife // 输出自执行的函数,除了 iife 还有 es、cjs、umd 模式
  4. rollup -i index.js --file dist.js --watch // 监听文件变化自动编译
4. 配置文件
  1. ESM
    rollup.config.js // ESM
    export default {
      input: 'index.js',
      output: {
        file: 'dist.js',
        format: 'umd',
        name: 'Index' // 使用 umd 规范时,需要声明 name,因为 umd 需要挂载到对应的命名空间上
      }
    }
    执行命令:rollup --config rollup.config.js
  2. cjs
    rollu.config.cjs // cjs
    module.exports = {
      input: 'index.js',
      output: {
        file: 'dist.js',
        format: 'umd',
        name: 'Index' // 使用 umd 规范时,需要声明 name,因为 umd 需要挂载到对应的命名空间上
      }
    }
    执行命令:rollup --config rollup.config.cjs
5. 环境变量:rollup --config rollup.config.js --environment TEST:123
  // rollup.config.js
  console.log(process.env.TEST) //123
6. Rollup Plugins // 提供了 Rollup 的各种丰富的能力
  1. 配置
    import resolve from '@rollup/plugin-node-resolve' // 把当前文件引入的模块打包在一起,npm i '@rollup/plugin-node-resolve'
    import json from '@rollup/plugin-json' // 可以 import json 文件,npm i '@rollup/plugin-json'
    import commonjs from '@rollup/plugin-commonjs' // 可以使用 ESM 模式导入以 cjs 导出的文件,npm i '@rollup/plugin-commonjs'
    import { terser } from 'rollup/plugin-terser' // 打包压缩,npm i 'rollup/plugin-terser'
    // rollup.config.js
    export default {
      input: 'index.js',
      external: ['react'], // 不把 react 和文件打包在一起,和 resolve plugin 作用相反
      output: {
        file: 'dist.js',
        format: 'es',
        plugins: [terser()], // 这边的 plugin 只有在输出时才执行,相对比较少
        banner: '/** Hello **/' // 在打包好的文件顶部注入对应的文字,使用 terser 压缩后不生效
      },
      plugins: [resolve(), commonjs(), json()] // 放在前面的插件先执行,有些插件有顺序要求,如 commonjs 要放在 babel 的前面
    }
  2. 建议配置文件可以使用数组,而不是对象,这样后期方便扩展,output 也支持配置数组
  3. Rollup 的编译流程就是调用各个插件执行,最后输出
  4. Rollup 的插件和 Webpack 类型,都可以在对应的 Hook 中执行对应的操作,具体可查看官网
----------------------------------------------------------------------------------------------
// esbuild
1. 无法编译 es5 的代码,在 Vite 中只在开发环境中使用,编译目标是 esnext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Last Updated: 2024/7/31 12:57:25
    飘向北方
    那吾克热-NW,尤长靖