UNPKG

3.69 kBJavaScriptView Raw
1
2const gulp = require('gulp');
3const rimraf = require('rimraf');
4const babel = require('gulp-babel');
5const merge2 = require('merge2');
6const rollup = require('rollup');
7const path = require('path');
8const fs = require('fs');
9const { terser } = require('rollup-plugin-terser');
10const babelPlugin = require('rollup-plugin-babel');
11const resolve = require('rollup-plugin-node-resolve');
12const commonjs = require('rollup-plugin-commonjs');
13const replace = require('rollup-plugin-replace');
14const json = require('rollup-plugin-json');
15const filesize = require('rollup-plugin-filesize');
16const postcss = require('rollup-plugin-postcss');
17const autoprefixer = require('autoprefixer');
18const cssnano = require('cssnano');
19const image = require('rollup-plugin-image');
20const readPkg = require('read-pkg');
21const pkg = readPkg.sync(process.cwd());
22
23const esBabelConfig = require('./babel/babel.es.js');
24const commonBabelConfig = require('./babel/babel.common.js');
25const getStreamPathList = require('../utils/index');
26const externalRegExp = new RegExp(Object.keys(pkg.dependencies).join('|'));
27
28const cwd = process.cwd();
29const { join } = path;
30
31const packagePth = join(cwd, 'package.json');
32const pkgJson = JSON.parse(fs.readFileSync(packagePth, 'utf8'));
33const nameList = pkgJson.name.split('/');
34const name = nameList.pop();
35
36const taskFunctionMap = {
37 es: compileComponent,
38 commonjs: compileComponent,
39 'dist': compileDist,
40 'dist:min': compileDistMin,
41};
42
43const plugins = [
44 postcss({
45 extensions: [ '.less', '.css' ],
46 plugins: [
47 autoprefixer(),
48 cssnano()
49 ]
50 }),
51 resolve({
52 module: true,
53 jsnext: true,
54 main: true,
55 browser: true,
56 }),
57 babelPlugin({
58 ...esBabelConfig,
59 runtimeHelpers: true,
60 exclude: 'node_modules/**'
61 }),
62 commonjs(),
63 image(),
64 replace({
65 exclude: 'node_modules/**',
66 'process.env.NODE_ENV': JSON.stringify('production')
67 }),
68 json(),
69 filesize(),
70];
71
72const miniPlugins = plugins.concat(terser({
73 compress: {
74 pure_getters: true,
75 unsafe: true,
76 unsafe_comps: true,
77 warnings: false
78 }
79}));
80
81//编译组件库
82function compileComponent(input, output, task) {
83 const dir = path.join(cwd, output);
84 const babelConfig = task === 'es' ? esBabelConfig : commonBabelConfig;
85
86 const jsStreamList = getStreamPathList(input);
87 const lessStreamList = getStreamPathList(input, 'less');
88 const assetsStreamList = getStreamPathList(input, '@(png|svg)');
89
90 rimraf.sync(dir);
91
92 const jsSteam =
93 gulp.src(jsStreamList)
94 .pipe(babel(babelConfig))
95 .pipe(gulp.dest(dir));
96 const lessSteam =
97 gulp.src(lessStreamList)
98 .pipe(gulp.dest(dir));
99
100 const assetsSteam =
101 gulp.src(assetsStreamList)
102 .pipe(gulp.dest(dir));
103
104 return merge2([jsSteam, lessSteam, assetsSteam]);
105}
106
107function compileDist(input, output) {
108
109 rollup.rollup({
110 input: `${input}/index.js`,
111 plugins,
112 external: id => externalRegExp.test(id)
113 }).then((bundle) => {
114 bundle.write({
115 file: `${output}/${name}.esm.js`,
116 format: 'es',
117 name
118 });
119 bundle.write({
120 file: `${output}/${name}.cjs.js`,
121 format: 'cjs',
122 name
123 });
124 bundle.write({
125 file: `${output}/${name}.js`,
126 format: 'umd',
127 name
128 });
129 })
130}
131
132function compileDistMin(input, output) {
133
134 rollup.rollup({
135 input: `${input}/index.js`,
136 plugins: miniPlugins,
137 external: id => externalRegExp.test(id)
138 }).then((bundle) => {
139 bundle.write({
140 file: `${output}/${name}.min.js`,
141 format: 'umd',
142 name,
143 indent: false
144 });
145 })
146
147}
148
149module.exports = function compile(task, input, output) {
150 taskFunctionMap[task](input, output, task);
151}
152
153