webpack.common.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. const path = require('path')
  2. const fs = require('fs-extra')
  3. const webpack = require('webpack')
  4. const CopyWebpackPlugin = require('copy-webpack-plugin')
  5. const ProgressBarPlugin = require('progress-bar-webpack-plugin')
  6. const ExtractTextPlugin = require('extract-text-webpack-plugin')
  7. const NameAllModulesPlugin = require('name-all-modules-plugin')
  8. const babelConfig = fs.readJsonSync(path.join(process.cwd(), '.babelrc'))
  9. const postCSSConfig = {
  10. config: {
  11. path: path.join(process.cwd(), 'dev/webpack/postcss.config.js')
  12. }
  13. }
  14. module.exports = {
  15. entry: {
  16. client: './client/index.js'
  17. },
  18. output: {
  19. path: path.join(process.cwd(), 'assets'),
  20. filename: 'js/[name].js',
  21. chunkFilename: 'js/[name].chunk.js'
  22. },
  23. module: {
  24. rules: [
  25. {
  26. test: /\.js$/,
  27. exclude: /node_modules/,
  28. use: [
  29. {
  30. loader: 'cache-loader',
  31. options: {
  32. cacheDirectory: '.webpack-cache'
  33. }
  34. },
  35. {
  36. loader: 'babel-loader',
  37. options: {
  38. ...babelConfig,
  39. cacheDirectory: true
  40. }
  41. }
  42. ]
  43. },
  44. {
  45. test: /\.css$/,
  46. use: [
  47. {
  48. loader: 'style-loader'
  49. },
  50. {
  51. loader: 'css-loader'
  52. },
  53. {
  54. loader: 'postcss-loader',
  55. options: postCSSConfig
  56. }
  57. ]
  58. },
  59. {
  60. test: /\.scss$/,
  61. use: ExtractTextPlugin.extract({
  62. fallback: 'style-loader',
  63. use: [
  64. {
  65. loader: 'css-loader'
  66. },
  67. {
  68. loader: 'postcss-loader',
  69. options: postCSSConfig
  70. },
  71. {
  72. loader: 'sass-loader',
  73. options: {
  74. sourceMap: false
  75. }
  76. }
  77. ]
  78. })
  79. },
  80. {
  81. test: /\.vue$/,
  82. loader: 'vue-loader',
  83. options: {
  84. extractCSS: ExtractTextPlugin,
  85. postcss: postCSSConfig,
  86. loaders: {
  87. css: [
  88. {
  89. loader: 'vue-style-loader'
  90. },
  91. {
  92. loader: 'css-loader'
  93. }
  94. ],
  95. scss: [
  96. {
  97. loader: 'vue-style-loader'
  98. },
  99. {
  100. loader: 'css-loader'
  101. },
  102. {
  103. loader: 'sass-loader',
  104. options: {
  105. sourceMap: false
  106. }
  107. },
  108. {
  109. loader: 'sass-resources-loader',
  110. options: {
  111. resources: path.join(process.cwd(), '/client/scss/global.scss')
  112. }
  113. }
  114. ],
  115. js: [
  116. {
  117. loader: 'cache-loader',
  118. options: {
  119. cacheDirectory: '.webpack-cache'
  120. }
  121. },
  122. {
  123. loader: 'babel-loader',
  124. options: {
  125. babelrc: path.join(process.cwd(), '.babelrc'),
  126. cacheDirectory: true
  127. }
  128. }
  129. ]
  130. }
  131. }
  132. },
  133. {
  134. test: /\.(png|jpg|gif)$/,
  135. use: [
  136. {
  137. loader: 'url-loader',
  138. options: {
  139. limit: 8192
  140. }
  141. }
  142. ]
  143. },
  144. {
  145. test: /\.svg$/,
  146. exclude: [
  147. path.join(process.cwd(), 'client/svg')
  148. ],
  149. use: [
  150. {
  151. loader: 'file-loader',
  152. options: {
  153. name: '[name].[ext]',
  154. outputPath: 'svg/'
  155. }
  156. }
  157. ]
  158. },
  159. {
  160. test: /\.svg$/,
  161. include: [
  162. path.join(process.cwd(), 'client/svg')
  163. ],
  164. use: [
  165. {
  166. loader: 'raw-loader'
  167. }
  168. ]
  169. }
  170. ]
  171. },
  172. plugins: [
  173. new ProgressBarPlugin({
  174. width: 72,
  175. complete: '▇',
  176. incomplete: '-'
  177. }),
  178. new webpack.BannerPlugin('Wiki.js - wiki.js.org - Licensed under AGPL'),
  179. new CopyWebpackPlugin([
  180. { from: 'client/static' }
  181. ], {
  182. }),
  183. new webpack.NamedModulesPlugin(),
  184. new webpack.NamedChunksPlugin((chunk) => {
  185. if (chunk.name) {
  186. return chunk.name
  187. }
  188. return chunk.modules.map(m => path.relative(m.context, m.request)).join('_')
  189. }),
  190. new webpack.optimize.CommonsChunkPlugin({
  191. name: 'vendor',
  192. minChunks(module) {
  193. return module.context && module.context.includes('node_modules')
  194. }
  195. }),
  196. new webpack.optimize.CommonsChunkPlugin({
  197. name: 'runtime',
  198. minChunks: Infinity
  199. }),
  200. new NameAllModulesPlugin()
  201. ],
  202. resolve: {
  203. symlinks: true,
  204. alias: {
  205. '@': path.join(process.cwd(), 'client'),
  206. 'vue$': 'vue/dist/vue.common.js'
  207. },
  208. extensions: [
  209. '.js',
  210. '.json',
  211. '.vue'
  212. ],
  213. modules: [
  214. 'node_modules'
  215. ]
  216. },
  217. target: 'web'
  218. }