index.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. const path = require('path')
  2. const { isWindows } = require('@vue/cli-shared-utils')
  3. function genTranspileDepRegex (transpileDependencies) {
  4. const deps = transpileDependencies.map(dep => {
  5. if (typeof dep === 'string') {
  6. const depPath = path.join('node_modules', dep, '/')
  7. return isWindows
  8. ? depPath.replace(/\\/g, '\\\\') // double escape for windows style path
  9. : depPath
  10. } else if (dep instanceof RegExp) {
  11. return dep.source
  12. }
  13. })
  14. return deps.length ? new RegExp(deps.join('|')) : null
  15. }
  16. module.exports = (api, options) => {
  17. const useThreads = process.env.NODE_ENV === 'production' && !!options.parallel
  18. const cliServicePath = require('path').dirname(require.resolve('@vue/cli-service'))
  19. const transpileDepRegex = genTranspileDepRegex(options.transpileDependencies)
  20. api.chainWebpack(webpackConfig => {
  21. webpackConfig.resolveLoader.modules.prepend(path.join(__dirname, 'node_modules'))
  22. const jsRule = webpackConfig.module
  23. .rule('js')
  24. .test(/\.m?jsx?$/)
  25. .exclude
  26. .add(filepath => {
  27. // always transpile js in vue files
  28. if (/\.vue\.jsx?$/.test(filepath)) {
  29. return false
  30. }
  31. // exclude dynamic entries from cli-service
  32. if (filepath.startsWith(cliServicePath)) {
  33. return true
  34. }
  35. // check if this is something the user explicitly wants to transpile
  36. if (transpileDepRegex && transpileDepRegex.test(filepath)) {
  37. return false
  38. }
  39. // Don't transpile node_modules
  40. return /node_modules/.test(filepath)
  41. })
  42. .end()
  43. .use('cache-loader')
  44. .loader('cache-loader')
  45. .options(api.genCacheConfig('babel-loader', {
  46. '@babel/core': require('@babel/core/package.json').version,
  47. '@vue/babel-preset-app': require('@vue/babel-preset-app/package.json').version,
  48. 'babel-loader': require('babel-loader/package.json').version,
  49. modern: !!process.env.VUE_CLI_MODERN_BUILD,
  50. browserslist: api.service.pkg.browserslist
  51. }, [
  52. 'babel.config.js',
  53. '.browserslistrc'
  54. ]))
  55. .end()
  56. if (useThreads) {
  57. const threadLoaderConfig = jsRule
  58. .use('thread-loader')
  59. .loader('thread-loader')
  60. if (typeof options.parallel === 'number') {
  61. threadLoaderConfig.options({ workers: options.parallel })
  62. }
  63. }
  64. jsRule
  65. .use('babel-loader')
  66. .loader('babel-loader')
  67. })
  68. }