vite插件開發(fā)之“動(dòng)態(tài)引入插件”

這是一個(gè)“動(dòng)態(tài)引入插件”的開發(fā)教程

最主要使用的插件api是resolveId和load

1. 首先vite插件接收的是一個(gè)對象

假如我們的插件命名為vite-dynamic-import

{
  name: "vite-dynamic-import";
}

這樣我們的插件就創(chuàng)建完成了~

2.一般我們可以給插件定義一個(gè)函數(shù)

export default function dynamicImport() {
  return {
    name: "vite-dynamic-import",
  };
}

3.resolveId 我們可以使用resolveId來處理需要被插件處理的文件

resolveId你可以理解為一個(gè)過濾器,當(dāng)發(fā)現(xiàn)一些特殊的import規(guī)則/路徑時(shí),需要給找出來

export default function dynamicImport() {
  return {
    name: "vite-dynamic-import",
    resolveId(source, importer) {
      if (source.endsWith("?dynamic_import")) {
        // 這里是為了讓我們在代碼里可以相當(dāng)路徑
        const resolvedPath = path.resolve(
          path.dirname(importer),
          source.replace("?dynamic_import", "")
        );
        return resolvedPath + "?dynamic_import";
      }
    },
  };
}

4.用load來處理編譯前的引入階段

load就是說在import的這些文件被編譯之前的階段,我們相當(dāng)于可以對源代碼進(jìn)行修改,當(dāng)然這個(gè)修改不是真的修改代碼,而是你理解為被vite載入到內(nèi)存里的代碼

export default function dynamicImport() {
  return {
    name: "vite-dynamic-import",
    resolveId(source, importer) {
      if (source.endsWith("?dynamic_import")) {
        // 這里是為了讓我們在代碼里可以相當(dāng)路徑
        const resolvedPath = path.resolve(
          path.dirname(importer),
          source.replace("?dynamic_import", "")
        );
        return resolvedPath + "?dynamic_import";
      }
    },
    load(id, options) {
      if (id.endsWith("?dynamic_import")) {
        const dirPath = path.resolve(id.replace('?dynamic_import', ''))
        const files = fs.readdirSync(dirPath)
        const imports = files.map(file => {
          // 利用path.extname取出文件擴(kuò)展名
          const fileExt = path.extname(file);
          // 利用path.basename取出文件名
          const name = path.basename(file, fileExt)
          return `import ${name} from "${path.join(dirPath, file)}"`
        }).join('\n')
        
        var exportObjectKeysString = files.map(file => {
          const name = path.basename(file, fileExt)
          return " " + name
        }).join(',\n')
        const exportObject = 'const markdownPaths = {\n' +  exportObjectKeysString + '\n}'

        return `${imports}\n\n${exportObject}\n\nexport default markdownPaths`
      }
    },
  };
}

5.vite-config配置

  plugins: [
    react(),
    dynamicImport(),
    ...
  ]

最后呈現(xiàn)的效果就是


// 這里我們只需要引入一句
import markdownPaths from "./docs?dynamic_import";

// 就可以達(dá)到如下的這個(gè)效果

// import a from "./docs/a.md";
// import b from "./docs/b.md";
// import c from "./docs/c.md";

// const markdownPaths = {
//   a,
//   b,
//   c
// };
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容