gulpfile.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. const gulp = require('gulp');
  2. // gulp core function
  3. const { src, dest, series, parallel, watch } = require('gulp');
  4. // gulp compress js
  5. const uglify = require('gulp-uglify');
  6. // gulp judgment
  7. const gulpif = require('gulp-if');
  8. // gulp compress css
  9. const cleanCSS = require('gulp-clean-css');
  10. // Delete Files
  11. const del = require('delete');
  12. // Refresh the browser in real time
  13. const browserSync = require('browser-sync').create();
  14. const reload = browserSync.reload;
  15. // proxy
  16. const { createProxyMiddleware } = require('http-proxy-middleware');
  17. // According to html reference, files are merged
  18. // const useref = require('gulp-useref');
  19. // File merge
  20. const concat = require('gulp-concat');
  21. // rollup packaging, processing es6 modules
  22. const { rollup } = require('rollup');
  23. // rollup looks for node_modules module
  24. const { nodeResolve } = require('@rollup/plugin-node-resolve');
  25. // rollup converts commonjs module to es6 module
  26. const commonjs = require('@rollup/plugin-commonjs');
  27. // rollup code compression
  28. const terser = require('rollup-plugin-terser').terser;
  29. // rollup babel plugin, support the latest ES grammar
  30. const babel = require('@rollup/plugin-babel').default;
  31. // const gulpBabel = require('gulp-babel');
  32. // Distinguish development and production environments
  33. const production = process.env.NODE_ENV === 'production' ? true : false;
  34. const pkg = require('./package.json');
  35. const banner = `/*! @preserve
  36. * ${pkg.name}
  37. * version: ${pkg.version}
  38. * https://github.com/mengshukeji/Luckysheet
  39. */`;
  40. // uglify js Compression configuration https://github.com/mishoo/UglifyJS#minify-options
  41. const uglifyOptions = {
  42. compress: {
  43. drop_console: true
  44. }
  45. }
  46. // babel config
  47. const babelConfig = {
  48. compact:false,
  49. babelHelpers: 'bundled',
  50. exclude: 'node_modules/**', // Only compile our source code
  51. plugins: [
  52. ],
  53. presets: [
  54. ['@babel/preset-env', {
  55. useBuiltIns: 'usage',
  56. corejs: 3,
  57. targets: {
  58. chrome: 58,
  59. ie: 11
  60. }
  61. }]
  62. ]
  63. };
  64. // file handler paths
  65. const paths = {
  66. // static resources,contains index.html, fonts and images,and extension plugins dependency
  67. staticHtml: ['src/*.html'],
  68. staticLibs: ['src/lib/**'],
  69. staticFonts: ['src/fonts/**'],
  70. staticAssets: ['src/assets/**'],
  71. staticImages: ['src/plugins/images/*.png'],
  72. staticExpendPlugins: ['src/expendPlugins/**', '!src/expendPlugins/**/plugin.js'],
  73. staticDemoData: ['src/demoData/*.js'],
  74. staticCssImages: ['src/css/**','!src/css/*.css'],
  75. // static resources dest
  76. destStaticHtml: ['dist'],
  77. destStaticLibs: ['dist/lib'],
  78. destStaticFonts: ['dist/fonts'],
  79. destStaticAssets: ['dist/assets'],
  80. destStaticImages: ['dist/plugins/images'],
  81. destStaticExpendPlugins: ['dist/expendPlugins'],
  82. destStaticDemoData: ['dist/demoData'],
  83. destStaticCssImages: ['dist/css'],
  84. //core es module
  85. core: ['src/**/*.js','!src/demoData/*.js','src/expendPlugins/**/plugin.js','!src/plugins/js/*.js'],
  86. //plugins src
  87. pluginsCss: ['src/plugins/css/*.css'],
  88. plugins: ['src/plugins/*.css'],
  89. css:['src/css/*.css','node_modules/flatpickr/dist/themes/light.css'],
  90. pluginsJs:[
  91. 'node_modules/jquery/dist/jquery.min.js',
  92. 'node_modules/uuid/dist/umd/uuid.min.js',
  93. 'src/plugins/js/clipboard.min.js',
  94. 'src/plugins/js/spectrum.min.js',
  95. 'src/plugins/js/jquery-ui.min.js',
  96. 'src/plugins/js/jquery.mousewheel.min.js',
  97. // 'src/plugins/js/numeral.min.js',
  98. 'src/plugins/js/html2canvas.min.js',
  99. 'src/plugins/js/localforage.min.js',
  100. 'src/plugins/js/lodash.min.js',
  101. 'src/plugins/js/jstat.min.js',
  102. 'src/plugins/js/crypto-api.min.js',
  103. 'src/plugins/js/jquery.sPage.min.js'
  104. ],
  105. //plugins concat
  106. concatPluginsCss: 'pluginsCss.css',
  107. concatPlugins: 'plugins.css',
  108. concatCss: 'luckysheet.css',
  109. concatPluginsJs: 'plugin.js',
  110. //plugins dest
  111. destPluginsCss: ['dist/plugins/css'],
  112. destPlugins: ['dist/plugins'],
  113. destCss: ['dist/css'],
  114. destPluginsJs: ['dist/plugins/js'],
  115. // Package directory
  116. dist: 'dist',
  117. };
  118. // Clear the dist directory
  119. function clean() {
  120. return del([paths.dist]);
  121. }
  122. // proxy middleware
  123. const apiProxy = createProxyMiddleware('/luckysheet/', {
  124. target: 'http://127.0.0.1/', // set your server address
  125. changeOrigin: true, // for vhosted sites
  126. ws: true, // proxy websockets
  127. });
  128. // Static server
  129. function serve(done) {
  130. browserSync.init({
  131. server: {
  132. baseDir: paths.dist,
  133. middleware: [apiProxy],//proxy
  134. },
  135. ghostMode: false, //默认true,滚动和表单在任何设备上输入将被镜像到所有设备里,会影响本地的协同编辑消息,故关闭
  136. }, done)
  137. }
  138. // Monitoring file changes
  139. function watcher(done) {
  140. watch(paths.core,{ delay: 500 }, series(core, reloadBrowser));
  141. // watch plugins and css
  142. watch(paths.pluginsCss,{ delay: 500 }, series(pluginsCss, reloadBrowser));
  143. watch(paths.plugins,{ delay: 500 }, series(plugins, reloadBrowser));
  144. watch(paths.css,{ delay: 500 }, series(css, reloadBrowser));
  145. watch(paths.pluginsJs,{ delay: 500 }, series(pluginsJs, reloadBrowser));
  146. // watch static
  147. watch(paths.staticHtml,{ delay: 500 }, series(copyStaticHtml, reloadBrowser));
  148. watch(paths.staticLibs,{ delay: 500 }, series(copyStaticLibs, reloadBrowser));
  149. watch(paths.staticFonts,{ delay: 500 }, series(copyStaticFonts, reloadBrowser));
  150. watch(paths.staticAssets,{ delay: 500 }, series(copyStaticAssets, reloadBrowser));
  151. watch(paths.staticImages,{ delay: 500 }, series(copyStaticImages, reloadBrowser));
  152. watch(paths.staticExpendPlugins,{ delay: 500 }, series(copyStaticExpendPlugins, reloadBrowser));
  153. watch(paths.staticDemoData,{ delay: 500 }, series(copyStaticDemoData, reloadBrowser));
  154. watch(paths.staticCssImages,{ delay: 500 }, series(copyStaticCssImages, reloadBrowser));
  155. done();
  156. }
  157. // Refresh browser
  158. function reloadBrowser(done) {
  159. reload();
  160. done();
  161. }
  162. //Package the core code
  163. async function core_rollup() {
  164. const bundle = await rollup({
  165. input: 'src/index.js',
  166. plugins: [
  167. nodeResolve(), // tells Rollup how to find date-fns in node_modules
  168. commonjs(), // converts date-fns to ES modules
  169. // postcss({
  170. // plugins: [],
  171. // extract: true,
  172. // // minimize: isProductionEnv,
  173. // }),
  174. production && terser(), // minify, but only in production
  175. babel(babelConfig)
  176. ],
  177. });
  178. bundle.write({
  179. file: 'dist/luckysheet.umd.js',
  180. format: 'umd',
  181. name: 'luckysheet',
  182. sourcemap: true,
  183. inlineDynamicImports:true,
  184. banner: banner
  185. });
  186. if(production){
  187. bundle.write({
  188. file: 'dist/luckysheet.esm.js',
  189. format: 'esm',
  190. name: 'luckysheet',
  191. sourcemap: true,
  192. inlineDynamicImports:true,
  193. banner: banner
  194. });
  195. }
  196. }
  197. async function core() {
  198. await require('esbuild').buildSync({
  199. format: 'iife',
  200. globalName: 'luckysheet',
  201. entryPoints: ['src/index.js'],
  202. bundle: true,
  203. minify: production,
  204. banner: { js: banner },
  205. target: ['es2015'],
  206. sourcemap: true,
  207. outfile: 'dist/luckysheet.umd.js',
  208. logLevel: 'error',
  209. })
  210. }
  211. // According to the build tag in html, package js and css
  212. function pluginsCss() {
  213. return src(paths.pluginsCss)
  214. .pipe(concat(paths.concatPluginsCss))
  215. .pipe(gulpif(production, cleanCSS()))
  216. .pipe(dest(paths.destPluginsCss))
  217. }
  218. function plugins() {
  219. return src(paths.plugins)
  220. .pipe(concat(paths.concatPlugins))
  221. .pipe(gulpif(production, cleanCSS()))
  222. .pipe(dest(paths.destPlugins));
  223. }
  224. function css() {
  225. return src(paths.css)
  226. .pipe(concat(paths.concatCss))
  227. .pipe(gulpif(production, cleanCSS()))
  228. .pipe(dest(paths.destCss));
  229. }
  230. function pluginsJs() {
  231. return src(paths.pluginsJs)
  232. .pipe(concat(paths.concatPluginsJs))
  233. .pipe(gulpif(production, uglify(uglifyOptions)))
  234. .pipe(dest(paths.destPluginsJs));
  235. }
  236. // Copy static resources
  237. function copyStaticHtml(){
  238. return src(paths.staticHtml)
  239. .pipe(dest(paths.destStaticHtml));
  240. }
  241. function copyStaticLibs(){
  242. return src(paths.staticLibs)
  243. .pipe(dest(paths.destStaticLibs));
  244. }
  245. function copyStaticFonts(){
  246. return src(paths.staticFonts)
  247. .pipe(dest(paths.destStaticFonts));
  248. }
  249. function copyStaticAssets(){
  250. return src(paths.staticAssets)
  251. .pipe(dest(paths.destStaticAssets));
  252. }
  253. function copyStaticImages(){
  254. return src(paths.staticImages)
  255. .pipe(dest(paths.destStaticImages));
  256. }
  257. function copyStaticExpendPlugins(){
  258. return src(paths.staticExpendPlugins)
  259. .pipe(dest(paths.destStaticExpendPlugins));
  260. }
  261. function copyStaticDemoData(){
  262. return src(paths.staticDemoData)
  263. .pipe(dest(paths.destStaticDemoData));
  264. // .pipe(gulpBabel({
  265. // presets: ['@babel/env']
  266. // }))
  267. // .pipe(gulp.dest('dist'));
  268. }
  269. function copyStaticCssImages(){
  270. return src(paths.staticCssImages)
  271. .pipe(dest(paths.destStaticCssImages));
  272. }
  273. const dev = series(clean, parallel(pluginsCss, plugins, css, pluginsJs, copyStaticHtml, copyStaticLibs, copyStaticFonts, copyStaticAssets, copyStaticImages, copyStaticExpendPlugins, copyStaticDemoData, copyStaticCssImages, core), watcher, serve);
  274. const build = series(clean, parallel(pluginsCss, plugins, css, pluginsJs, copyStaticHtml, copyStaticLibs, copyStaticFonts, copyStaticAssets, copyStaticImages, copyStaticExpendPlugins, copyStaticDemoData, copyStaticCssImages, core));
  275. exports.dev = dev;
  276. exports.build = build;
  277. exports.default = dev;