babel-plugin-preset

47 阅读1分钟

babel 插件常用格式

export default function(api, options, dirname) {
  return {
    inherits: parentPlugin,
    manipulateOptions(options, parserOptions) {
        options.xxx = '';
    },
    pre(file) {
      this.cache = new Map();
    },
    visitor: {
      StringLiteral(path, state) {
        this.cache.set(path.node.value, 1);
      }
    },
    post(file) {
      console.log(this.cache);
    }
  };
} 

首先,插件函数有 3 个参数,api、options、dirname。

  • api 里包含了各种 babel 的 api,比如 types、template 等,这些包就不用在插件里单独单独引入了,直接取来用就行。
  • options 就是外面传入的参数
  • dirname 是目录名(不常用)

返回的对象有 inherits、manipulateOptions、pre、visitor、post 等属性。

  • inherits 指定继承某个插件,和当前插件的 options 合并,通过 Object.assign 的方式。
  • visitor 指定 traverse 时调用的函数。
  • pre 和 post 分别在遍历前后调用,可以做一些插件调用前后的逻辑,比如可以往 file(表示文件的对象,在插件里面通过 state.file 拿到)中放一些东西,在遍历的过程中取出来。
  • manipulateOptions 用于修改 options,是在插件里面修改配置的方式,比如 syntaxt plugin一般都会修改 parser options:

// 引自 <<Babel 插件通关秘籍>> image.png

export default function(api, options) {
  return {
      plugins: ['pluginA'],
      presets: [['presetsB', { options: 'bbb'}]]
  }
}

顺序

preset 和 plugin 从形式上差不多,但是应用顺序不同。

babel 会按照如下顺序处理插件和 preset:

  1. 先应用 plugin,再应用 preset
  2. plugin 从前到后,preset 从后到前

这个顺序是 babel 的规定。