gulp+rollup结合打包自己的TS/JS库

这篇博客介绍了如何结合gulp和rollup来打包TypeScript和JavaScript库。作者提供了gulpfile.js、package.json和tsconfig.json的配置示例,并说明了将源代码放在src文件夹中,通过npm安装依赖并运行gulp命令,即可在dist目录下生成d.ts和js文件。

由于项目需要,网上找了不少资料,总结了一套适合项目的打包流程,把ts代码打包成js库

首先是gulpfile.js文件,直接贴上代码:

const gulp = require('gulp')
const rollup = require('rollup')
const clean = require('gulp-clean')
const rename = require("gulp-rename");
const uglify = require('gulp-uglify-es').default;

const rollupTypescript = require('rollup-plugin-typescript2')

gulp.task('clean', function () {
    return gulp
        .src('dist', { read: false, allowEmpty: true })
        .pipe(clean('dist'));
});



gulp.task('clean-js', function () {
    return gulp
        .src('dist/**/*.js', { read: false })
        .pipe(clean('*.js'));
});


gulp.task("build", async function () {
    const subTask = await rollup.rollup({
        input: "src/XH.ts",
		output: {
			file: 'dist/XHLib.js',
			format: 'umd', //iife
            extend: true,
			name: 'XH'
		  },
        plugins: [
            rollupTypescript()
        ]
    });
	
	await subTask.write({
            file: 'dist/XHLib.js',
			format: 'umd', //iife
            extend: true,
			name: 'XH'
        });
});

 gulp.task("uglify", function () {
     return gulp.src("dist/*.js")
         .pipe(rename({ suffix: '.min' }))
         .pipe(uglify(/* options */))
         .pipe(gulp.dest("dist/"));
 });

gulp.task('default'
    , gulp.series(
        gulp.parallel('clean'),
        gulp.parallel('clean-js'),
        gulp.parallel('build'),
        gulp.parallel('uglify')
    )
)

然后是package.json

{
  "name": "XHLib",
  "version": "1.0.0",
  "description": "",
  "main": "XHLib.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "SixSir",
  "license": "ISC",
  "devDependencies": {
    "typescript": "^3.8.3",
    "gulp": "^4.0.2",
    "gulp-clean": "^0.4.0",
    "gulp-rename": "^2.0.0",
    "gulp-uglify-es": "^2.0.0",
    "rollup": "^2.0.6",
    "rollup-plugin-typescript2": "^0.26.0"
  }
}

最后是tsconfig.json:

{
  "compilerOptions": {
    "module": "es6",
    "target": "es6",
    "noEmitHelpers": false,
    "sourceMap": false,
    "declaration": true,
    "noImplicitReturns":false,
    "allowUnreachableCode":false
  },
  "exclude": [
    "node_modules"
  ]
}

代码放在同目录下的src文件夹就好

3个必要的配置文件准备好了后,运行:

npm install

gulp

生成的d.ts 和 js文件会在dist目录下

我在进行组件和项目link软连接的时候出现了在项目中使用组件无法显示的问题(在组件测试的时候可以正常显示)下方是我组件打包文件import { rollup } from ‘rollup’ import { resolve } from ‘path’ import vue from ‘@vitejs/plugin-vue’ import { nodeResolve } from ‘@rollup/plugin-node-resolve’ import esbuild from ‘rollup-plugin-esbuild’ import commonjs from ‘@rollup/plugin-commonjs’ import glob from ‘fast-glob’ import type { TaskFunction } from ‘gulp’ import type { Plugin } from ‘rollup’ //项目根目录 const projRoot = resolve(__dirname, ‘…’, ‘…’, ‘…’,‘…’) //包目录 const pkgRoot = resolve(projRoot, ‘packages’) //输出目录 const epOutput = resolve(projRoot,‘dist’) //打包入口文件过滤 export const excludeFiles = (files: string[]) => { const excludes = [‘node_modules’, ‘mock’, ‘gulpfile’, ‘dist’] return files.filter(path => !excludes.some(exclude => path.includes(exclude))) } export const buildModules:TaskFunction = async () =>{ const input = excludeFiles( await glob(‘**/*.{js,ts,vue}’, { cwd: pkgRoot, absolute: true, onlyFiles: true }) ) const plugins: Plugin[] = [ nodeResolve({ extensions: [‘.mjs’, ‘.js’, ‘.json’, ‘.ts’] }), esbuild(), commonjs(), vue() ] const bundle = await rollup({ input, plugins, external: [‘vue’,/@vue/g] //这里我们先写死,因为我们组件目前比较简单 }) bundle.write({ format: ‘esm’, //输出的模块格式 dir: resolve(epOutput, ‘es’), //输出的目录 preserveModules: true, //保持原模块的目录结构,而不是打包成一个文件 preserveModulesRoot: pkgRoot, //指定根目录,这里我们先指定我们的组件目录, entryFileNames: [name].mjs //输出为 .mjs,name是入口 }) }下方是package.json配置{ "name": "build", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "gulp --require @esbuild-kit/cjs-loader -f gulpfile.ts" }, "keywords": [], "author": "", "license": "ISC", "packageManager": "pnpm@10.15.1", "dependencies": { "@esbuild-kit/cjs-loader": "^2.4.4", "@rollup/plugin-commonjs": "^28.0.6", "@rollup/plugin-node-resolve": "^16.0.1", "@vitejs/plugin-vue": "^6.0.1", "fast-glob": "^3.3.3", "gulp": "^4.0.2", "rollup": "^4.50.1", "rollup-plugin-esbuild": "^6.2.1" } }
09-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值