dify-components
Version:
This is a modern component library template based on Turborepo+Vue 3.5+TypeScript.
111 lines (105 loc) • 3.06 kB
JavaScript
const { rollup } = require('rollup');
const vuePlugin = require('@vitejs/plugin-vue'); // Vue 单文件组件编译插件
const vueJSXPlugin = require('@vitejs/plugin-vue-jsx'); // Vue jsx组件编译插件
const esbuild = require('rollup-plugin-esbuild').default; // esbuild 快速的 JavaScript/TypeScript 转译器
const { nodeResolve } = require('@rollup/plugin-node-resolve'); // 解析 node_modules 中的模块
const scss = require('rollup-plugin-scss'); // 编译 SCSS 文件
const dts = require('rollup-plugin-dts').default; // 生成 TypeScript 声明文件
const alias = require('@rollup/plugin-alias'); // 创建导入别名
const json = require('@rollup/plugin-json'); // 处理 JSON 文件
const copy = require('rollup-plugin-copy'); // 复制文件
const path = require('path'); // Node.js 路径模块
// 解析文件路径的辅助函数
const resolveFile = (...args) => path.resolve(__dirname, ...args);
/**
* 通用插件配置
* @param {*} options.minify // 是否压缩
* @param {*} options.style // 样式
* @returns {Array} Plugins
*/
const getPlugins = (options = {}) => {
return [
alias({
entries: [{ find: '~/_utils', replacement: resolveFile('../packages/ui/src/_utils') }],
}),
json({
preferConst: true,
}),
vuePlugin(),
vueJSXPlugin(),
nodeResolve({
extensions: ['.ts', '.tsx', '.vue', '.js', '.scss'],
moduleDirectories: ['node_modules', 'src'],
}),
esbuild({
tsconfig: resolveFile('./tsconfig.json'),
minify: options.minify,
jsx: 'preserve',
}),
!options.style && scss({ output: false }),
].filter(Boolean);
};
async function bundleUI() {
const input = resolveFile('../packages/ui/src/index.ts');
const external = ['vue'];
const configs = [
// 生成 ESM
{
input,
external,
output: {
file: resolveFile('dist/ui/esm/index.mjs'),
format: 'esm',
exports: 'named',
},
plugins: getPlugins(),
},
// 生成 CommonJS
{
input,
external,
output: {
file: resolveFile('dist/ui/cjs/index.js'),
format: 'cjs',
exports: 'named',
},
plugins: getPlugins(),
},
// 生成类型
{
input,
external,
output: {
file: resolveFile('dist/ui/types/index.d.ts'),
format: 'esm',
},
plugins: [
copy({
targets: [
{
src: '../packages/ui/src/types/global.d.ts',
dest: 'dist/ui',
},
],
}),
dts(),
],
},
// 生成样式和压缩版代码文件
{
input,
external,
output: {
file: resolveFile('dist/ui/index.min.js'),
format: 'esm',
},
plugins: [...getPlugins({ style: true, minify: true }), scss({ fileName: 'style.css' })],
},
];
for (const config of configs) {
const bundle = await rollup(config);
await bundle.write(config.output);
await bundle.close();
}
}
module.exports = bundleUI;