vue.config.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. 'use strict';
  2. const path = require('path');
  3. const webpack = require('webpack');
  4. const CompressionPlugin = require('compression-webpack-plugin');
  5. const HtmlWebpackPlugin = require('html-webpack-plugin');
  6. // describe: 预渲染 author: Wgy date:2020-08-07
  7. const PrerenderSPAPlugin = require('prerender-spa-plugin');
  8. const Renderer = PrerenderSPAPlugin.PuppeteerRenderer;
  9. function resolve(dir) {
  10. return path.join(__dirname, dir);
  11. }
  12. const name = 'st vue'; // page title
  13. const port = 9000; // dev port
  14. // All configuration item explanations can be find in https://cli.vuejs.org/config/
  15. module.exports = {
  16. publicPath: process.env.PUBLIC_PATH,
  17. // publicPath: process.env.NODE_ENV === 'production'
  18. // ? secondaryPath
  19. // : process.env.PUBLIC_PATH, // des: 部署应用包时的基本 二级目录时开启此处 URL author: wxy data: 2019/12/30
  20. // publicPath: './', //vueConf.baseUrl, // 根域上下文目录
  21. outputDir: 'dist', // 构建输出目录
  22. assetsDir: process.env.ASSETS_DIR,
  23. // assetsDir: './', // 静态资源目录 (js, css, img, fonts)
  24. lintOnSave: true, // 是否开启eslint保存检测,有效值:ture | false | 'error'
  25. runtimeCompiler: true, // 运行时版本是否需要编译
  26. transpileDependencies: [], // 默认babel-loader忽略modealias_modules,这里可增加例外的依赖包名
  27. productionSourceMap: false, // 是否在构建生产包时生成 sourceMap 文件,false将提高构建速度
  28. devServer: {
  29. port: port,
  30. open: true,
  31. overlay: {
  32. warnings: false,
  33. errors: true,
  34. },
  35. proxy: {
  36. // change xxx-api/login => mock/login
  37. // detail: https://cli.vuejs.org/config/#devserver-proxy
  38. [process.env.VUE_APP_BASE_API]: {
  39. target: process.env.VUE_APP_BASE_API_TARGET,
  40. changeOrigin: true,
  41. pathRewrite: {
  42. ['^' + process.env.VUE_APP_BASE_API]: '',
  43. },
  44. },
  45. },
  46. },
  47. pwa: {
  48. iconPaths: {
  49. favicon32: process.env.VUE_APP_INDEX_TINY_ICON,
  50. favicon16: process.env.VUE_APP_INDEX_TINY_ICON,
  51. appleTouchIcon: process.env.VUE_APP_INDEX_TINY_ICON,
  52. maskIcon: process.env.VUE_APP_INDEX_TINY_ICON,
  53. msTileImage: process.env.VUE_APP_INDEX_TINY_ICON,
  54. },
  55. },
  56. chainWebpack: config => {
  57. config.resolve.alias
  58. .set('@', path.resolve(__dirname, './src'))
  59. .set('excelVendor', path.resolve(__dirname, './src/utils/excelVendor'));
  60. config.plugins.delete('preload');
  61. config.plugins.delete('prefetch');
  62. config.plugin('provide')
  63. .use(webpack.ProvidePlugin, [
  64. {
  65. 'window.Quill': 'quill',
  66. introJs: 'intro.js',
  67. },
  68. ]);
  69. },
  70. configureWebpack: config => {
  71. Object.assign(config, {
  72. name: name,
  73. // 开发生产共同配置
  74. });
  75. if (process.env.ENV === 'production') {
  76. let cssFilesArr = [
  77. `external/kityformula/kityformula/assets/styles/base.css`,
  78. `external/kityformula/kityformula/assets/styles/ui.css`,
  79. `external/kityformula/kityformula/assets/styles/scrollbar.css`,
  80. ];
  81. let jsFilesArr = [
  82. `external/js/vue@2.6.10.js`,
  83. `external/js/vue-router@3.1.3.js`,
  84. `external/js/element-ui@2.12.0.js`,
  85. `external/js/echarts@4.2.1.js`,
  86. `external/js/aliyun-upload-sdk/lib/es6-promise.min.js`,
  87. `external/js/aliyun-upload-sdk/lib/aliyun-oss-sdk-5.3.1.min.js`,
  88. `external/js/aliyun-upload-sdk/aliyun-upload-sdk-1.5.0.min.js`,
  89. `external/kityformula/kityformula/js/jquery-1.11.0.min.js`,
  90. `external/kityformula/kityformula/js/kitygraph.all.js`,
  91. `external/kityformula/kityformula/js/kity-formula-render.all.js`,
  92. `external/kityformula/kityformula/js/kity-formula-parser.all.min.js`,
  93. `external/kityformula/kityformula/js/kityformula-editor.all.min.js`,
  94. ];
  95. // 为生产环境修改配置...
  96. config.mode = 'production';
  97. Object.assign(config, {
  98. externals: {
  99. 'vue-router': 'VueRouter',
  100. 'element-ui': 'ELEMENT',
  101. 'echarts': 'echarts',
  102. 'vue': 'Vue',
  103. // 'vuex': 'Vuex'
  104. },
  105. plugins: [
  106. ...config.plugins,
  107. new HtmlWebpackPlugin({
  108. template: path.join(__dirname, './src/utils/st/index.html'),//指定模板页面,根据指定的路径生成内存中的页面
  109. templateParameters: {
  110. 'BASE_URL': process.env.PUBLIC_PATH,
  111. 'VUE_APP_INDEX_TINY_ICON': process.env.VUE_APP_INDEX_TINY_ICON,
  112. 'VUE_APP_INDEX_TITLE': process.env.VUE_APP_INDEX_TITLE,
  113. 'cssVendor': cssFilesArr,
  114. 'jsVendor': jsFilesArr,
  115. },
  116. filename: 'index.html', //指定内存中生成的页面的名称
  117. /* inject: true,
  118. favicon: process.env.BASE_URL+ 'favicon-saas.ico'*/
  119. }),
  120. new CompressionPlugin({
  121. test: /\.js$|\.html$|.\css/, // 匹配文件名 ttf
  122. threshold: 10240, // 对超过10k的数据压缩
  123. deleteOriginalAssets: false, // 不删除源文件
  124. }),
  125. new PrerenderSPAPlugin({
  126. // 生成文件的路径,也可以与webpakc打包的一致。
  127. // 下面这句话非常重要!!!
  128. // 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。
  129. staticDir: path.join(__dirname,'dist'),
  130. // 对应自己的路由文件,比如a有参数,就需要写成 /a/param1。
  131. routes: ['/', '/index','/c/examsystem'],
  132. // 这个很重要,如果没有配置这段,也不会进行预编译
  133. renderer: new Renderer({
  134. inject: {
  135. foo: 'bar'
  136. },
  137. headless: false,
  138. // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。
  139. renderAfterDocumentEvent: 'render-event'
  140. })
  141. }),
  142. ],
  143. });
  144. } else {
  145. // 为开发环境修改配置...
  146. config.mode = 'development';
  147. }
  148. },
  149. css: {
  150. // 当为true时,css文件名可省略 module 默认为 false
  151. modules: false,
  152. // 是否将组件中的 CSS 提取至一个独立的 CSS 文件中,当作为一个库构建时,你也可以将其设置为 false 免得用户自己导入 CSS
  153. // 默认生产环境下是 true,开发环境下是 false
  154. extract: false,
  155. // 是否为 CSS 开启 source map。设置为 true 之后可能会影响构建的性能
  156. sourceMap: false,
  157. //向 CSS 相关的 loader 传递选项(支持 css-loader postcss-loader sass-loader less-loader stylus-loader)
  158. loaderOptions: {
  159. css: {},
  160. less: {},
  161. sass: {
  162. /*data: `@import "@/assets/css/main.scss";`*/
  163. },
  164. },
  165. },
  166. /*configureWebpack: {
  167. // provide the app's title in webpack's name field, so that
  168. // it can be accessed in index.html to inject the correct title.
  169. name: name,
  170. resolve: {
  171. alias: {
  172. '@': resolve('src'),
  173. 'excelVendor': resolve('src/utils/excelVendor'),
  174. },
  175. },
  176. externals: {
  177. 'vue': 'Vue',
  178. 'vue-router': 'VueRouter',
  179. 'element-ui': 'ELEMENT',
  180. 'echarts': 'echarts',
  181. },
  182. plugins: [
  183. new CompressionPlugin({
  184. test: /\.js$|\.html$|.\css/, // 匹配文件名 ttf
  185. threshold: 10240, // 对超过10k的数据压缩
  186. deleteOriginalAssets: false, // 不删除源文件
  187. }),
  188. ],
  189. },*/
  190. /*chainWebpack(config) {
  191. const cdn = {
  192. // inject tinymce into index.html
  193. // why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one
  194. js: ['https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js']
  195. }
  196. config.plugin('html')
  197. .tap(args => {
  198. args[0].cdn = cdn
  199. return args
  200. })
  201. config.plugins.delete('preload') // TODO: need test
  202. config.plugins.delete('prefetch') // TODO: need test
  203. // set svg-sprite-loader
  204. config.module
  205. .rule('svg')
  206. .exclude.add(resolve('src/icons'))
  207. .end()
  208. config.module
  209. .rule('icons')
  210. .test(/\.svg$/)
  211. .include.add(resolve('src/icons'))
  212. .end()
  213. .use('svg-sprite-loader')
  214. .loader('svg-sprite-loader')
  215. .options({
  216. symbolId: 'icon-[name]'
  217. })
  218. .end()
  219. // set preserveWhitespace
  220. config.module
  221. .rule('vue')
  222. .use('vue-loader')
  223. .loader('vue-loader')
  224. .tap(options => {
  225. options.compilerOptions.preserveWhitespace = true
  226. return options
  227. })
  228. .end()
  229. config
  230. // https://webpack.js.org/configuration/devtool/#development
  231. .when(process.env.ENV === 'development',
  232. config => config.devtool('cheap-source-map')
  233. )
  234. config
  235. .when(process.env.ENV !== 'development',
  236. config => {
  237. config
  238. .plugin('ScriptExtHtmlWebpackPlugin')
  239. .after('html')
  240. .use('script-ext-html-webpack-plugin', [{
  241. // `runtime` must same as runtimeChunk name. default is `runtime`
  242. inline: /runtime\..*\.js$/
  243. }])
  244. .end()
  245. config
  246. .optimization.splitChunks({
  247. chunks: 'all',
  248. cacheGroups: {
  249. libs: {
  250. name: 'chunk-libs',
  251. test: /[\\/]node_modules[\\/]/,
  252. priority: 10,
  253. chunks: 'initial' // only package third parties that are initially dependent
  254. },
  255. elementUI: {
  256. name: 'chunk-elementUI', // split elementUI into a single package
  257. priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
  258. test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
  259. },
  260. commons: {
  261. name: 'chunk-commons',
  262. test: resolve('src/components'), // can customize your rules
  263. minChunks: 3, // minimum common number
  264. priority: 5,
  265. reuseExistingChunk: true
  266. }
  267. }
  268. })
  269. config.optimization.runtimeChunk('single')
  270. }
  271. )
  272. }*/
  273. };