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