webpack.base.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /**
  2. * @Author: HuaChao Chen <CHC>
  3. * @Date: 2017-05-07T20:11:11+08:00
  4. * @Email: chenhuachaoxyz@gmail.com
  5. * @Filename: webpack.base.js
  6. * @Last modified by: chc
  7. * @Last modified time: 2017-11-26T22:25:40+08:00
  8. * @License: MIT
  9. * @Copyright: 2017
  10. */
  11. var path = require('path');
  12. var webpack = require('webpack');
  13. var HtmlWebpackPlugin = require('html-webpack-plugin');
  14. var ExtractTextPlugin = require('extract-text-webpack-plugin');
  15. var WebpackMd5Hash = require('webpack-md5-hash');
  16. // 该插件是对“webpack-md5-hash”的改进:在主文件中获取到各异步模块的hash值,然后将这些hash值与主文件的代码内容一同作为计算hash的参数,这样就能保证主文件的hash值会跟随异步模块的修改而修改。
  17. // var WebpackSplitHash = require('webpack-split-hash');
  18. // 压缩css
  19. var OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
  20. var CopyWebpackPlugin = require('copy-webpack-plugin');
  21. var fs = require("fs");
  22. // var postcss = require('postcss-loader')
  23. const extractCSS = new ExtractTextPlugin('css/[name].css');
  24. module.exports = {
  25. module: {
  26. rules: [
  27. {
  28. test: /\.vue$/,
  29. loader: 'vue-loader',
  30. options: {
  31. postcss: [
  32. require('autoprefixer')({
  33. browsers: ['last 10 Chrome versions', 'last 5 Firefox versions', 'Safari >= 6', 'ie > 8']
  34. })
  35. ]
  36. }
  37. },
  38. {
  39. test: /\.js$/,
  40. loader: 'babel-loader',
  41. // exclude: /.*node_modules((?!auto-textarea).)*$/
  42. // exclude: /node_modules/
  43. include: [
  44. path.resolve(__dirname, '../src'),
  45. fs.realpathSync('node_modules/auto-textarea')
  46. ]
  47. },
  48. {
  49. test: /\.(png|jpg|gif)$/,
  50. loader: 'file-loader',
  51. options: { name: '[name].[ext]?[hash]' }
  52. },
  53. { test: /\.(woff|ttf|eot|svg)/, loader: 'file-loader?name=font/[name].[ext]&publicPath=../' },
  54. {
  55. test: /\.styl$/,
  56. loader: 'style-loader!css-loader!stylus-loader'
  57. },
  58. {
  59. // css代码分割打包
  60. test: /\.css$/,
  61. // exclude: /node_modules/,
  62. use: extractCSS.extract({
  63. fallback: 'style-loader',
  64. use: [
  65. {
  66. loader: 'css-loader'
  67. },
  68. {
  69. loader: 'postcss-loader',
  70. options: {
  71. plugins: function() {
  72. return [
  73. // 允许在子中定义要放在最顶层的样式
  74. require('postcss-atroot')({}),
  75. // 允许定义样式函数
  76. require('postcss-mixins')({}),
  77. // import插件
  78. require('postcss-nested-import')({}),
  79. // 类sass-import插件,但是没法嵌套导入
  80. // require('postcss-partial-import')({}),
  81. // 嵌套解析插件
  82. require('postcss-nested')({}),
  83. // 可以通过引用方式引用父/其他样式的属性值
  84. require('postcss-nesting')({}),
  85. // 允许自定义选择器别名
  86. require('postcss-custom-selectors')({}),
  87. // 可自定义属性块别名,后面可扩充
  88. require('postcss-extend')({}),
  89. // 允许类sass的变量定义,for和each语法
  90. require('postcss-advanced-variables')({}),
  91. // 支持颜色函数color
  92. require('postcss-color-function')({}),
  93. // 支持media的变量定义
  94. require('postcss-custom-media')({}),
  95. // 支持属性自定义
  96. require('postcss-custom-properties')({}),
  97. // 支持media的最大最小值定义 可以通过类似@media screen and (width >= 500px) and (width <= 1200px){}来书写
  98. require('postcss-media-minmax')({}),
  99. // 支持通过@引用本属性块的属性
  100. require('postcss-property-lookup')({}),
  101. // maches函数,p:matches(:first-child, .special)解析为p:first-child, p.special
  102. require('postcss-selector-matches')({}),
  103. // 支持not解析,p:not(:first-child, .special)解析为p:not(:first-child), p:not(.special)
  104. require('postcss-selector-not')({})
  105. ];
  106. }
  107. }
  108. }
  109. ]
  110. })
  111. },{
  112. test: /\.md$/,
  113. loader: 'raw-loader'
  114. },{
  115. test: /\.less$/,
  116. loader: 'style-loader!css-loader!less-loader'
  117. }
  118. ]
  119. },
  120. performance: {
  121. hints: false
  122. },
  123. plugins: [
  124. // 分离css
  125. extractCSS,
  126. // 分离js可能引入的css的chunkhash计算
  127. new WebpackMd5Hash(),
  128. // 对css文件进行压缩
  129. new OptimizeCssAssetsPlugin({
  130. assetNameRegExp: /\.css$/g,
  131. cssProcessor: require('cssnano'),
  132. cssProcessorOptions: { discardComments: { removeAll: true } },
  133. canPrint: true
  134. }),
  135. new CopyWebpackPlugin([{
  136. from: path.resolve(__dirname, '../resources/highlight.js-9.12.0'),
  137. to: path.resolve(__dirname, '../dist/highlightjs')
  138. }, {
  139. from: path.resolve(__dirname, '../resources/markdown'),
  140. to: path.resolve(__dirname, '../dist/markdown')
  141. }, {
  142. from: path.resolve(__dirname, '../node_modules/katex/dist'),
  143. to: path.resolve(__dirname, '../dist/katex')
  144. }])
  145. ]
  146. }