utils.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. 'use strict'
  2. const MiniCssPlugin = require('mini-css-extract-plugin')
  3. const dotenv = require('dotenv')
  4. const { join, resolve } = require('path')
  5. const argv = require('minimist')(process.argv.slice(2))
  6. const rootResolve = (...pathSegments) => join(__dirname, '..', ...pathSegments)
  7. function getEnv() {
  8. return argv['m']
  9. }
  10. function getEnvPath() {
  11. if (String(typeof getEnv()) === 'boolean' || String(typeof getEnv()) === 'undefined') {
  12. return rootResolve('env/.env')
  13. }
  14. return rootResolve(`env/${getEnv()}.env`)
  15. }
  16. function getConfig() {
  17. return dotenv.config({ path: getEnvPath() }).parsed
  18. }
  19. // 获取环境
  20. exports.getEnv = getEnv()
  21. // 获取配置
  22. exports.getConfig = getConfig()
  23. exports.cssLoaders = function (options) {
  24. options = options || {}
  25. const esbuildCss = {
  26. loader: 'esbuild-loader',
  27. options: {
  28. loader: 'css',
  29. minify: options.minifyCss,
  30. },
  31. }
  32. const cssLoader = {
  33. loader: 'css-loader',
  34. options: {
  35. sourceMap: options.sourceMap,
  36. esModule: false,
  37. },
  38. }
  39. const postcssLoader = {
  40. loader: 'postcss-loader',
  41. options: {
  42. sourceMap: options.sourceMap,
  43. },
  44. }
  45. // 这里就是生成loader和其对应的配置
  46. function generateLoaders(loader, loaderOptions) {
  47. const loaders = [cssLoader, postcssLoader, esbuildCss]
  48. if (loader) {
  49. loaders.push({
  50. loader: loader + '-loader',
  51. options: Object.assign({}, loaderOptions, {
  52. sourceMap: options.sourceMap,
  53. }),
  54. })
  55. }
  56. // 当配置信息中开启此项时,启用css分离压缩
  57. // 这一项在生产环境时,是默认开启的
  58. if (options.extract) {
  59. return [MiniCssPlugin.loader].concat(loaders)
  60. } else {
  61. // 如果不开启则让vue-style-loader来处理
  62. return ['vue-style-loader'].concat(loaders)
  63. }
  64. }
  65. // https://vue-loader.vuejs.org/en/configurations/extract-css.html
  66. return {
  67. css: generateLoaders(),
  68. postcss: generateLoaders(),
  69. less: generateLoaders('less'),
  70. sass: generateLoaders('sass', { indentedSyntax: true }),
  71. scss: generateLoaders('sass'),
  72. stylus: generateLoaders('stylus'),
  73. styl: generateLoaders('stylus'),
  74. }
  75. }
  76. // 根据上面的函数遍历出来的各个css预处理器的loader进行最后的拼装
  77. exports.styleLoaders = function (options) {
  78. const output = []
  79. const loaders = exports.cssLoaders(options)
  80. for (const extension in loaders) {
  81. const loader = loaders[extension]
  82. output.push({
  83. test: new RegExp('\\.' + extension + '$'),
  84. use: loader,
  85. })
  86. }
  87. return output
  88. }