-
Notifications
You must be signed in to change notification settings - Fork 164
/
Copy pathgulpfile.js
208 lines (183 loc) · 5.53 KB
/
gulpfile.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
// gulp
const gulp = require("gulp");
// gulp 核心方法
const { src, dest, series, parallel, watch } = require('gulp');
// 浏览器加载Nodejs模块
const browserify = require("browserify");
// vinyl-source-stream会将Browserify的输出文件适配成gulp能够解析的格式
const source = require('vinyl-source-stream');
// Watchify启动Gulp并保持运行状态,当你保存文件时自动编译。 帮你进入到编辑-保存-刷新浏览器的循环中
const watchify = require("watchify");
// tsify是Browserify的一个插件,就像gulp-typescript一样,它能够访问TypeScript编译器
const tsify = require("tsify");
// 代码压缩混淆
const uglify = require('gulp-uglify');
// 支持sourcemaps
const sourcemaps = require('gulp-sourcemaps');
// 支持sourcemaps
const buffer = require('vinyl-buffer');
// 控制台打印日志
const log = require("fancy-log");
// 删除文件
const del = require('delete');
// 实时刷新浏览器
const browserSync = require('browser-sync').create();
const reload = browserSync.reload;
// rollup packaging, processing es6 modules
const { rollup } = require('rollup');
// rollup typescript
const typescript = require('rollup-plugin-typescript2');
// rollup looks for node_modules module
// const { nodeResolve } = require('@rollup/plugin-node-resolve');
// rollup converts commonjs module to es6 module
// const commonjs = require('@rollup/plugin-commonjs');
// rollup code compression
// const terser = require('rollup-plugin-terser').terser;
// rollup babel plugin, support the latest ES grammar
// const babel = require('@rollup/plugin-babel').default;
const pkg = require('./package.json');
const paths = {
pages: ['src/*.html',"assets/**"]
};
// babel config
// const babelConfig = {
// babelHelpers: 'bundled',
// exclude: 'node_modules/**', // Only compile our source code
// plugins: [
// ],
// presets: [
// ['@babel/preset-env', {
// useBuiltIns: 'usage',
// corejs: 3,
// targets: {
// chrome: 58,
// ie: 11
// }
// }],
// '@babel/preset-typescript'
// ]
// };
// Copy html
function copyHtml(){
return src(paths.pages)
.pipe(dest("dist"));
}
// Refresh browser
function reloadBrowser(done) {
reload();
done();
}
// Monitoring static file changes
function watcher(done) {
// watch static
watch(paths.pages,{ delay: 500 }, series(copyHtml, reloadBrowser));
done();
}
// 监听文件改变
const watchedBrowserify = watchify(browserify({
basedir: '.',
debug: true,
entries: [
'src/main.umd.ts'
],
cache: {},
packageCache: {},
standalone:'LuckyExcel'
}).plugin(tsify));
// 开发模式,打包成es5,方便在浏览器里直接引用调试
function bundle() {
return watchedBrowserify
.transform('babelify', {
presets: ['@babel/preset-env','@babel/preset-typescript'],
extensions: ['.ts']
})
.bundle()
.pipe(source('luckyexcel.umd.js'))
.pipe(buffer())
.pipe(sourcemaps.init({loadMaps: true}))
// .pipe(uglify()) //Development environment does not need to compress code
.pipe(sourcemaps.write('./'))
.pipe(dest("dist"));
}
// 生产模式,打包成ES模块和Commonjs模块
async function compile() {
const bundle = await rollup({
input: 'src/main.esm.ts',
plugins: [
// nodeResolve(), // tells Rollup how to find date-fns in node_modules
// commonjs(), // converts date-fns to ES modules
typescript({
tsconfigOverride: {
compilerOptions : { module: "ESNext" }
}
}),
// terser(), // minify, but only in production
// babel(babelConfig)
],
});
bundle.write({
file: pkg.module,
format: 'esm',
name: 'LuckyExcel',
inlineDynamicImports:true,
// sourcemap: true
})
bundle.write({
file: pkg.main,
format: 'cjs',
name: 'LuckyExcel',
inlineDynamicImports:true,
// sourcemap: true
})
// bundle.write({
// file: pkg.browser,
// format: 'umd',
// name: 'LuckyExcel',
// inlineDynamicImports:true,
// // sourcemap: true
// })
}
// 生产模式,打包成UMD模块
function bundleUMD() {
return browserify({
basedir: '.',
entries: ['src/main.umd.ts'],
cache: {},
packageCache: {},
standalone:'LuckyExcel'
})
.plugin(tsify)
.transform('babelify', {
presets: ['@babel/preset-env','@babel/preset-typescript'],
extensions: ['.ts']
})
.bundle()
.pipe(source('luckyexcel.umd.js'))
.pipe(buffer())
// .pipe(sourcemaps.init({loadMaps: true})) //The production environment does not need source map file
// .pipe(uglify())
.pipe(sourcemaps.write('./'))
.pipe(dest("dist"));
}
// 清除dist目录
function clean() {
return del(['dist']);
}
// 静态服务器
function serve() {
browserSync.init({
server: {
baseDir: "dist"
}
});
}
// 顺序执行
const dev = series(clean, copyHtml, bundle, watcher, serve);
const build = series(clean, parallel(copyHtml, compile, bundleUMD));
// 每次TypeScript文件改变时Browserify会执行bundle函数
watchedBrowserify.on("update", series(bundle, reload));
// 将日志打印到控制台
watchedBrowserify.on("log", log);
exports.dev = dev;
exports.build = build;
exports.default = dev;