webpack.common.js 4.6 KB

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