LOADING

gulp

2024/11/14

通过 esbuild 去打包,再通过 gulp 流传输,指定 task,形成任务队列

gulp dev 的时候监控文件的改变

通过 vue serve 可以用来测试,打开一个单页组件

"test:Pager": "vue serve ./src/components/Pager/test.vue",

gulp 的打包由 gulpfile.js 来当配置文件

打包步骤:

1.清空当前的文件夹(utils 或者 ui)

2.根据命令是否为 dev 判断打包成开发模式还是生产模式

纯函数

开发模式:sourcemaps,通过 ts.config 去打包成 js

生产模式:通过 ts.config 去打包成 js

vue 组件

开发模式:通过 gulp-esbuild 打包,设置 sourcemaps,设置混淆,引入一些第三方插件(element-plus,axios,打包模式,平台)

生产模式:通过 gulp-esbuild 打包,引入一些第三方插件(element-plus,axios,打包模式,平台)

3.复制 package.json 文件进入打包

gulp 命令

task:任务

series:队列,去顺序执行

打包配置

import { source, dist } from "../config";
import { task, watch, series, parallel, src, dest } from "gulp";
import * as clean from "gulp-clean";
import { createProject } from "gulp-typescript";
import * as esbuild from "gulp-esbuild";
import * as terser from "gulp-terser";
import * as sourcemaps from "gulp-sourcemaps";
import * as log from "fancy-log";
const pluginVue = require("esbuild-plugin-vue-next");

const tsPackages = ["utils"];
const vuePackages = ["ui"];
const outputWithoutDist = ["bootstrap", "utils"];

const distId = process.argv.indexOf("--dist");
const outdir = distId > 0 ? process.argv[distId + 1] || dist : dist;
console.log("outdir", outdir);

function buildTsPackage(packageName: string) {
  const distDir = outputWithoutDist.includes(packageName) ? "" : "dist";
  const project = createProject(`${source}/${packageName}/tsconfig.json`);
  return project
    .src()
    .pipe(project())
    .pipe(dest(`${outdir}/${packageName}/${distDir}`));
}

function buildTsPackageDev(packageName: string) {
  const distDir = outputWithoutDist.includes(packageName) ? "" : "dist";
  const project = createProject(`${source}/${packageName}/tsconfig.json`);
  return project
    .src()
    .pipe(sourcemaps.init())
    .pipe(project())
    .pipe(
      sourcemaps.mapSources(
        (sourcePath: string) => "./" + sourcePath.split("/").pop()
      )
    )
    .pipe(sourcemaps.write(".", {}))
    .pipe(dest(`${outdir}/${packageName}/${distDir}`));
}

function buildVuePackage(packageName: string) {
  const distDir = outputWithoutDist.includes(packageName) ? "" : "dist";
  return src([
    `${source}/${packageName}/**/*.ts`,
    `${source}/${packageName}/**/*.vue`,
    `!${source}/${packageName}/**/*.d.ts`,
  ])
    .pipe(
      esbuild({
        outfile: "index.js",
        bundle: true,
        format: "esm",
        platform: "node",
        plugins: [pluginVue()],
        sourcemap: false,
        external: ["vue", "element-plus", "uuid", "axios"],
      })
    )
    .pipe(
      terser({
        mangle: {
          toplevel: true,
          eval: true,
        },
      })
    )
    .pipe(dest(`${outdir}/${packageName}/${distDir}`));
}

function buildVuePackageDev(packageName: string) {
  const distDir = outputWithoutDist.includes(packageName) ? "" : "dist";
  return src(`${source}/${packageName}/src/index.ts`)
    .pipe(
      esbuild({
        outfile: "index.js",
        bundle: true,
        format: "esm",
        platform: "node",
        plugins: [pluginVue()],
        sourcemap: true,
        external: ["vue", "element-plus", "uuid", "axios"],
      })
    )
    .pipe(dest(`${outdir}/${packageName}/${distDir}`));
}

function cleanPackage(packageName: string) {
  return src([`${outdir}/${packageName}/*`], { read: false }).pipe(clean());
}

function copyPackageJson(packageName: string) {
  return src(`${source}/${packageName}/package.json`).pipe(
    dest(`${outdir}/${packageName}`)
  );
}

tsPackages.forEach((packageName) => {
  task(
    packageName,
    series(
      () => cleanPackage(packageName),
      () => buildTsPackage(packageName),
      () => copyPackageJson(packageName)
    )
  );
  task(
    `${packageName}:dev`,
    series(
      () => cleanPackage(packageName),
      () => buildTsPackageDev(packageName),
      () => copyPackageJson(packageName)
    )
  );
});

vuePackages.forEach((packageName) => {
  task(
    packageName,
    series(
      () => cleanPackage(packageName),
      () => buildVuePackage(packageName),
      () => copyPackageJson(packageName)
    )
  );
  task(
    `${packageName}:dev`,
    series(
      () => cleanPackage(packageName),
      () => buildVuePackageDev(packageName),
      () => copyPackageJson(packageName)
    )
  );
});

//默认任务:监控文件自动进行build:dev
function defaultTask() {
  log.info("Watching files..");
  tsPackages.concat(vuePackages).forEach((packageName) => {
    watch(
      [
        `${source}/${packageName}/**/*.ts`,
        `${source}/${packageName}/*.ts`,
        `${source}/${packageName}/**/*.vue`,
        `${source}/${packageName}/*.vue`,
      ],
      series(`${packageName}:dev`)
    );
  });
}
task("default", defaultTask);