build-js.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /* eslint import/no-extraneous-dependencies: ["error", {"devDependencies": true}] */
  2. /* eslint no-console: "off" */
  3. const gulp = require('gulp');
  4. const fs = require('fs');
  5. const rollup = require('rollup');
  6. const buble = require('rollup-plugin-buble');
  7. const replace = require('rollup-plugin-replace');
  8. const resolve = require('rollup-plugin-node-resolve');
  9. const header = require('gulp-header');
  10. const uglify = require('gulp-uglify');
  11. const sourcemaps = require('gulp-sourcemaps');
  12. const rename = require('gulp-rename');
  13. const config = require('./build-config.js');
  14. const banner = require('./banner.js');
  15. function es(components, cb) {
  16. const env = process.env.NODE_ENV || 'development';
  17. const target = process.env.TARGET || config.target;
  18. // Bundle
  19. rollup.rollup({
  20. input: './src/swiper.js',
  21. external: ['dom7/dist/dom7.modular', 'ssr-window'],
  22. plugins: [
  23. replace({
  24. delimiters: ['', ''],
  25. 'process.env.NODE_ENV': JSON.stringify(env),
  26. 'process.env.TARGET': JSON.stringify(target),
  27. '//IMPORT_COMPONENTS': components.map(component => `import ${component.capitalized} from './components/${component.name}/${component.name}';`).join('\n'),
  28. '//INSTALL_COMPONENTS': components.map(component => `${component.capitalized}`).join(',\n '),
  29. '//EXPORT': 'export default Swiper',
  30. }),
  31. resolve({ jsnext: true }),
  32. ],
  33. }).then(bundle => bundle.write({
  34. format: 'es',
  35. name: 'Swiper',
  36. strict: true,
  37. sourcemap: env === 'development',
  38. sourcemapFile: `./${env === 'development' ? 'build' : 'dist'}/js/swiper.esm.bundle.js.map`,
  39. banner,
  40. file: `./${env === 'development' ? 'build' : 'dist'}/js/swiper.esm.bundle.js`,
  41. })).then(() => {
  42. if (cb) cb();
  43. }).catch((err) => {
  44. if (cb) cb();
  45. console.error(err.toString());
  46. });
  47. // Modular
  48. rollup.rollup({
  49. input: './src/swiper.js',
  50. external: ['dom7/dist/dom7.modular', 'ssr-window'],
  51. plugins: [
  52. replace({
  53. delimiters: ['', ''],
  54. 'process.env.NODE_ENV': JSON.stringify(env),
  55. 'process.env.TARGET': JSON.stringify(target),
  56. '//IMPORT_COMPONENTS': components.map(component => `import ${component.capitalized} from './components/${component.name}/${component.name}';`).join('\n'),
  57. '//INSTALL_COMPONENTS': '',
  58. '//EXPORT': `export { Swiper, ${components.map(component => component.capitalized).join(', ')} }`,
  59. }),
  60. resolve({ jsnext: true }),
  61. ],
  62. }).then(bundle => bundle.write({
  63. format: 'es',
  64. name: 'Swiper',
  65. strict: true,
  66. banner,
  67. sourcemap: env === 'development',
  68. sourcemapFile: `./${env === 'development' ? 'build' : 'dist'}/js/swiper.esm.js.map`,
  69. file: `./${env === 'development' ? 'build' : 'dist'}/js/swiper.esm.js`,
  70. })).then(() => {
  71. if (cb) cb();
  72. }).catch((err) => {
  73. if (cb) cb();
  74. console.error(err.toString());
  75. });
  76. }
  77. function umd(components, cb) {
  78. const env = process.env.NODE_ENV || 'development';
  79. const target = process.env.TARGET || config.target;
  80. rollup.rollup({
  81. input: './src/swiper.js',
  82. plugins: [
  83. replace({
  84. delimiters: ['', ''],
  85. 'process.env.NODE_ENV': JSON.stringify(env),
  86. 'process.env.TARGET': JSON.stringify(target),
  87. '//IMPORT_COMPONENTS': components.map(component => `import ${component.capitalized} from './components/${component.name}/${component.name}';`).join('\n'),
  88. '//INSTALL_COMPONENTS': components.map(component => `${component.capitalized}`).join(',\n '),
  89. '//EXPORT': 'export default Swiper;',
  90. }),
  91. resolve({ jsnext: true }),
  92. buble(),
  93. ],
  94. }).then(bundle => bundle.write({
  95. format: 'umd',
  96. name: 'Swiper',
  97. strict: true,
  98. sourcemap: env === 'development',
  99. sourcemapFile: `./${env === 'development' ? 'build' : 'dist'}/js/swiper.js.map`,
  100. banner,
  101. file: `./${env === 'development' ? 'build' : 'dist'}/js/swiper.js`,
  102. })).then(() => {
  103. if (env === 'development') {
  104. if (cb) cb();
  105. return;
  106. }
  107. // Minified version
  108. gulp.src('./dist/js/swiper.js')
  109. .pipe(sourcemaps.init())
  110. .pipe(uglify())
  111. .pipe(header(banner))
  112. .pipe(rename((filePath) => {
  113. /* eslint no-param-reassign: ["error", { "props": false }] */
  114. filePath.basename += '.min';
  115. }))
  116. .pipe(sourcemaps.write('./'))
  117. .pipe(gulp.dest('./dist/js/'))
  118. .on('end', () => {
  119. cb();
  120. });
  121. }).catch((err) => {
  122. if (cb) cb();
  123. console.error(err.toString());
  124. });
  125. }
  126. function build(cb) {
  127. const env = process.env.NODE_ENV || 'development';
  128. const components = [];
  129. config.components.forEach((name) => {
  130. // eslint-disable-next-line
  131. const capitalized = name.split('-').map((word) => {
  132. return word.split('').map((char, index) => {
  133. if (index === 0) return char.toUpperCase();
  134. return char;
  135. }).join('');
  136. }).join('');
  137. const jsFilePath = `./src/components/${name}/${name}.js`;
  138. if (fs.existsSync(jsFilePath)) {
  139. components.push({ name, capitalized });
  140. }
  141. });
  142. const expectCbs = env === 'development' ? 1 : 2;
  143. let cbs = 0;
  144. umd(components, () => {
  145. cbs += 1;
  146. if (cbs === expectCbs) cb();
  147. });
  148. if (env !== 'development') {
  149. es(components, () => {
  150. cbs += 1;
  151. if (cbs === expectCbs) cb();
  152. });
  153. }
  154. }
  155. module.exports = build;