vite有哪些常见的hook?

48 阅读2分钟

"```markdown

Vite 常见的 Hook

Vite 是一个现代前端构建工具,提供了多种生命周期 Hook 来帮助开发者在不同的阶段执行自定义逻辑。以下是一些常见的 Hook。

1. configureServer

当 Vite 启动开发服务器时,configureServer Hook 会被调用。这个 Hook 可以用来修改 Vite 的开发服务器配置,例如添加中间件。

// vite.config.js
export default {
  configureServer(server) {
    server.middlewares.use((req, res, next) => {
      console.log('请求: ', req.url);
      next();
    });
  }
};

2. buildStart

在构建开始时,buildStart Hook 会被调用。这个 Hook 可以用于在构建之前执行一些初始化操作。

// vite.config.js
export default {
  buildStart() {
    console.log('构建开始');
  }
};

3. resolveId

resolveId Hook 在 Vite 尝试解析模块 ID 时被调用。可以用来自定义模块的解析逻辑。

// vite.config.js
export default {
  resolveId(source) {
    if (source === 'my-module') {
      return 'path/to/my-module.js';
    }
  }
};

4. load

load Hook 用于加载模块的内容。可以在此 Hook 中修改模块的内容或添加额外的处理。

// vite.config.js
export default {
  load(id) {
    if (id.endsWith('.my')) {
      return 'export default \"Hello from .my file!\"';
    }
  }
};

5. transform

transform Hook 在模块内容转换时被调用。可以用来在 Vite 转换代码之前或之后插入自定义逻辑。

// vite.config.js
export default {
  transform(code, id) {
    if (id.endsWith('.js')) {
      return {
        code: code.replace(/console.log/g, 'console.warn'),
        map: null
      };
    }
  }
};

6. generateBundle

在生成最终的输出包时,generateBundle Hook 会被调用。可以在这里进行最终的打包处理。

// vite.config.js
export default {
  generateBundle(options, bundle) {
    console.log('生成包:', bundle);
  }
};

7. writeBundle

在写入包到文件系统后,writeBundle Hook 被调用。可以在这里执行一些清理工作或后处理。

// vite.config.js
export default {
  writeBundle(options, bundle) {
    console.log('包已写入:', options);
  }
};

8. closeBundle

closeBundle Hook 在所有的输出都写入后被调用。可以用于执行清理或通知操作。

// vite.config.js
export default {
  closeBundle() {
    console.log('构建完成');
  }
};

9. handleHotUpdate

在模块热更新时,handleHotUpdate Hook 会被调用。可以用来处理热更新逻辑。

// vite.config.js
export default {
  handleHotUpdate({ file, server }) {
    console.log(`热更新: ${file}`);
  }
};

10. transformIndexHtml

此 Hook 允许在生成 HTML 文件之前修改其内容。可以用于插入自定义的 <script><link> 标签。

// vite.config.js
export default {
  transformIndexHtml(html) {
    return html.replace(
      '<title>Vite App</title>',
      '<title>Custom Vite App</title>'
    );
  }
};