webpack.config.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. const path = require('path');
  2. const webpack = require('webpack');
  3. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  4. const pkg = require('../package.json');
  5. const bannerPack = new webpack.BannerPlugin({
  6. banner: [
  7. `Quill Editor v${pkg.version}`,
  8. 'https://quilljs.com/',
  9. 'Copyright (c) 2014, Jason Chen',
  10. 'Copyright (c) 2013, salesforce.com',
  11. ].join('\n'),
  12. entryOnly: true,
  13. });
  14. const constantPack = new webpack.DefinePlugin({
  15. QUILL_VERSION: JSON.stringify(pkg.version),
  16. });
  17. const source = [
  18. 'quill.js',
  19. 'core.js',
  20. 'blots',
  21. 'core',
  22. 'formats',
  23. 'modules',
  24. 'test',
  25. 'themes',
  26. 'ui',
  27. ].map(file => {
  28. return path.resolve(__dirname, '..', file);
  29. });
  30. const jsRules = {
  31. test: /\.js$/,
  32. include: source,
  33. use: [
  34. {
  35. loader: 'babel-loader',
  36. options: {
  37. presets: [
  38. [
  39. '@babel/env',
  40. {
  41. targets: {
  42. browsers: [
  43. 'last 2 Chrome major versions',
  44. 'last 2 Firefox major versions',
  45. 'last 2 Safari major versions',
  46. 'last 2 Edge major versions',
  47. 'last 2 iOS major versions',
  48. 'last 2 ChromeAndroid major versions',
  49. ],
  50. },
  51. },
  52. ],
  53. ],
  54. },
  55. },
  56. ],
  57. };
  58. const svgRules = {
  59. test: /\.svg$/,
  60. include: [path.resolve(__dirname, '../assets/icons')],
  61. use: [
  62. {
  63. loader: 'html-loader',
  64. options: {
  65. minimize: true,
  66. },
  67. },
  68. ],
  69. };
  70. const stylRules = {
  71. test: /\.styl$/,
  72. include: [path.resolve(__dirname, '../assets')],
  73. use: [MiniCssExtractPlugin.loader, 'css-loader', 'stylus-loader'],
  74. };
  75. const tsRules = {
  76. test: /\.ts$/,
  77. use: [
  78. {
  79. loader: 'ts-loader',
  80. options: {
  81. compilerOptions: {
  82. declaration: false,
  83. module: 'es6',
  84. sourceMap: true,
  85. target: 'es6',
  86. },
  87. transpileOnly: true,
  88. },
  89. },
  90. ],
  91. };
  92. const baseConfig = {
  93. mode: 'development',
  94. context: path.resolve(__dirname, '..'),
  95. entry: {
  96. 'quill.js': ['./quill.js'],
  97. 'quill.core.js': ['./core.js'],
  98. 'quill.core': './assets/core.styl',
  99. 'quill.bubble': './assets/bubble.styl',
  100. 'quill.snow': './assets/snow.styl',
  101. 'unit.js': './test/unit.js',
  102. },
  103. output: {
  104. filename: '[name]',
  105. library: 'Quill',
  106. libraryExport: 'default',
  107. libraryTarget: 'umd',
  108. path: path.resolve(__dirname, '../dist/'),
  109. },
  110. resolve: {
  111. alias: {
  112. parchment: path.resolve(
  113. __dirname,
  114. '../node_modules/parchment/src/parchment',
  115. ),
  116. },
  117. extensions: ['.js', '.styl', '.ts'],
  118. },
  119. module: {
  120. rules: [jsRules, stylRules, svgRules, tsRules],
  121. noParse: [
  122. /\/node_modules\/clone\/clone\.js$/,
  123. /\/node_modules\/eventemitter3\/index\.js$/,
  124. /\/node_modules\/extend\/index\.js$/,
  125. ],
  126. },
  127. plugins: [
  128. bannerPack,
  129. constantPack,
  130. new MiniCssExtractPlugin({
  131. filename: '[name].css',
  132. }),
  133. ],
  134. devServer: {
  135. contentBase: path.resolve(__dirname, '../dist'),
  136. hot: false,
  137. port: process.env.npm_package_config_ports_webpack,
  138. stats: 'minimal',
  139. disableHostCheck: true,
  140. },
  141. };
  142. module.exports = env => {
  143. if (env && env.minimize) {
  144. const { devServer, ...prodConfig } = baseConfig;
  145. return {
  146. ...prodConfig,
  147. mode: 'production',
  148. entry: { 'quill.min.js': './quill.js' },
  149. devtool: 'source-map',
  150. };
  151. }
  152. if (env && env.coverage) {
  153. baseConfig.module.rules[0].use[0].options.plugins = ['istanbul'];
  154. return baseConfig;
  155. }
  156. return baseConfig;
  157. };