1 |
|
2 | const gulp = require('gulp');
|
3 | const rimraf = require('rimraf');
|
4 | const babel = require('gulp-babel');
|
5 | const merge2 = require('merge2');
|
6 | const rollup = require('rollup');
|
7 | const path = require('path');
|
8 | const fs = require('fs');
|
9 | const { terser } = require('rollup-plugin-terser');
|
10 | const babelPlugin = require('rollup-plugin-babel');
|
11 | const resolve = require('rollup-plugin-node-resolve');
|
12 | const commonjs = require('rollup-plugin-commonjs');
|
13 | const replace = require('rollup-plugin-replace');
|
14 | const json = require('rollup-plugin-json');
|
15 | const filesize = require('rollup-plugin-filesize');
|
16 | const postcss = require('rollup-plugin-postcss');
|
17 | const autoprefixer = require('autoprefixer');
|
18 | const cssnano = require('cssnano');
|
19 | const image = require('rollup-plugin-image');
|
20 | const readPkg = require('read-pkg');
|
21 | const pkg = readPkg.sync(process.cwd());
|
22 |
|
23 | const esBabelConfig = require('./babel/babel.es.js');
|
24 | const commonBabelConfig = require('./babel/babel.common.js');
|
25 | const getStreamPathList = require('../utils/index');
|
26 | const externalRegExp = new RegExp(Object.keys(pkg.dependencies).join('|'));
|
27 |
|
28 | const cwd = process.cwd();
|
29 | const { join } = path;
|
30 |
|
31 | const packagePth = join(cwd, 'package.json');
|
32 | const pkgJson = JSON.parse(fs.readFileSync(packagePth, 'utf8'));
|
33 | const nameList = pkgJson.name.split('/');
|
34 | const name = nameList.pop();
|
35 |
|
36 | const taskFunctionMap = {
|
37 | es: compileComponent,
|
38 | commonjs: compileComponent,
|
39 | 'dist': compileDist,
|
40 | 'dist:min': compileDistMin,
|
41 | };
|
42 |
|
43 | const 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 |
|
72 | const miniPlugins = plugins.concat(terser({
|
73 | compress: {
|
74 | pure_getters: true,
|
75 | unsafe: true,
|
76 | unsafe_comps: true,
|
77 | warnings: false
|
78 | }
|
79 | }));
|
80 |
|
81 |
|
82 | function 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 |
|
107 | function 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 |
|
132 | function 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 |
|
149 | module.exports = function compile(task, input, output) {
|
150 | taskFunctionMap[task](input, output, task);
|
151 | }
|
152 |
|
153 |
|