chain-webpack.js 5.2 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1 2
const path = require('path')

3 4 5 6
const {
  sassLoaderVersion
} = require('@dcloudio/uni-cli-shared/lib/scss')

fxy060608's avatar
fxy060608 已提交
7 8 9 10
const {
  getPartialIdentifier
} = require('./util')

fxy060608's avatar
fxy060608 已提交
11 12 13 14
function resolve (dir) {
  return path.resolve(__dirname, '..', dir)
}

fxy060608's avatar
fxy060608 已提交
15
module.exports = function chainWebpack (platformOptions, vueOptions, api) {
fxy060608's avatar
fxy060608 已提交
16 17 18 19 20
  const {
    runByHBuilderX, // 使用 HBuilderX 运行
    cssPreprocessOptions
  } = require('@dcloudio/uni-cli-shared')

21
  return function (webpackConfig) {
fxy060608's avatar
fxy060608 已提交
22
    // 处理静态资源 limit
23
    const urlLoader = require('@dcloudio/uni-cli-shared/lib/url-loader')
fxy060608's avatar
fxy060608 已提交
24 25 26 27 28
    const staticTypes = ['images', 'media', 'fonts']
    staticTypes.forEach(staticType => {
      webpackConfig.module
        .rule(staticType)
        .use('url-loader')
29 30
        .loader(urlLoader.loader)
        .tap(options => Object.assign(options, urlLoader.options()))
fxy060608's avatar
fxy060608 已提交
31
    })
fxy060608's avatar
fxy060608 已提交
32 33 34
    // 条件编译 vue 文件统一直接过滤html,js,css三种类型,单独资源文件引用各自过滤

    const loaders = {
fxy060608's avatar
fxy060608 已提交
35 36 37 38
      scss: 'sass-loader',
      sass: 'sass-loader',
      less: 'less-loader',
      stylus: 'stylus-loader'
fxy060608's avatar
fxy060608 已提交
39 40 41 42 43 44 45 46 47 48
    }
    // 独立css,postcss,scss,sass,less,stylus
    const cssLang = ['css', 'postcss', 'scss', 'sass', 'less', 'stylus']

    const cssTypes = ['vue-modules', 'vue', 'normal-modules', 'normal']

    cssLang.forEach(lang => {
      const langRule = webpackConfig.module.rule(lang)
      const loader = loaders[lang]
      cssTypes.forEach(type => {
fxy060608's avatar
fxy060608 已提交
49 50
        if (process.env.UNI_USING_CACHE) {
          langRule.oneOf(type)
fxy060608's avatar
fxy060608 已提交
51
            .use('uniapp-cache-css')
fxy060608's avatar
fxy060608 已提交
52 53 54 55 56 57 58
            .loader('cache-loader')
            .options(api.genCacheConfig(
              'css-loader/' + process.env.UNI_PLATFORM,
              getPartialIdentifier()
            ))
            .before('css-loader')
        }
fxy060608's avatar
fxy060608 已提交
59
        langRule.oneOf(type)
fxy060608's avatar
fxy060608 已提交
60
          .use('uniapp-preprocss')
fxy060608's avatar
fxy060608 已提交
61 62
          .loader(resolve('packages/webpack-preprocess-loader'))
          .options(cssPreprocessOptions)
63
          .after('css-loader') // 在 css-loader 之前条件编译一次
fxy060608's avatar
fxy060608 已提交
64

65
        if (loader) { // 在 scss,less,stylus 之前先条件编译一次(似乎没有必要了,保证css-loader处理一次即可,前提是条件编译注释都还存在)
fxy060608's avatar
fxy060608 已提交
66
          langRule.oneOf(type)
fxy060608's avatar
fxy060608 已提交
67
            .use('uniapp-preprocss-' + lang)
fxy060608's avatar
fxy060608 已提交
68 69 70 71 72 73 74
            .loader(resolve('packages/webpack-preprocess-loader'))
            .options(cssPreprocessOptions)
            .after(loader)
        }
      })
    })

75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
    if (sassLoaderVersion >= 8) { // check indentedSyntax
      // vue cli 3 and sass-loader 8
      cssTypes.forEach(type => {
        webpackConfig.module.rule('sass').oneOf(type).use('sass-loader').tap(options => {
          if (options.indentedSyntax) {
            if (!options.sassOptions) {
              options.sassOptions = {}
            }
            options.sassOptions.indentedSyntax = true
            delete options.indentedSyntax
          }
          return options
        })
      })
    }

fxy060608's avatar
fxy060608 已提交
91
    platformOptions.chainWebpack(webpackConfig, vueOptions, api)
fxy060608's avatar
fxy060608 已提交
92
    // define
93 94
    const deferredCreated = process.env.UNI_PLATFORM === 'mp-toutiao' ||
      process.env.UNI_PLATFORM === 'quickapp-webview'
fxy060608's avatar
fxy060608 已提交
95 96 97
    const defines = {
      'process.env.UNI_ENV': JSON.stringify(process.env.UNI_PLATFORM),
      'process.env.UNI_CLOUD_PROVIDER': process.env.UNI_CLOUD_PROVIDER,
雪洛's avatar
雪洛 已提交
98
      'process.env.UNICLOUD_DEBUG': process.env.UNICLOUD_DEBUG,
99
      'process.env.RUN_BY_HBUILDERX': process.env.RUN_BY_HBUILDERX,
fxy060608's avatar
fxy060608 已提交
100 101
      'process.env.UNI_AUTOMATOR_WS_ENDPOINT': JSON.stringify(process.env.UNI_AUTOMATOR_WS_ENDPOINT)
    }
fxy060608's avatar
fxy060608 已提交
102 103 104 105 106 107
    if (process.env.UNI_USING_VUE3) {
      Object.assign(defines, {
        __UNI_WX_API__: JSON.stringify(process.env.UNI_USING_WX_API === 'true'),
        __UNI_WXS_API__: JSON.stringify(process.env.UNI_USING_WXS_API === 'true'),
        __UNI_PROMISE_API__: JSON.stringify(process.env.UNI_USING_PROMISE_API === 'true'),
        __VUE_OPTIONS_API__: JSON.stringify(process.env.UNI_USING_VUE3_OPTIONS_API === 'true'),
fxy060608's avatar
fxy060608 已提交
108 109
        __VUE_CREATED_DEFERRED__: JSON.stringify(deferredCreated),
        __VUE_PROD_DEVTOOLS__: JSON.stringify(false)
fxy060608's avatar
fxy060608 已提交
110 111 112 113 114 115
      })
    }
    if (process.env.UNI_PLATFORM === 'h5') {
      // TODO manifest.json
      defines.__UNI_ROUTER_MODE__ = JSON.stringify('hash')
    }
fxy060608's avatar
fxy060608 已提交
116

fxy060608's avatar
fxy060608 已提交
117 118
    webpackConfig
      .plugin('uni-define')
fxy060608's avatar
fxy060608 已提交
119
      .use(require.resolve('webpack/lib/DefinePlugin'), [defines])
fxy060608's avatar
fxy060608 已提交
120 121 122 123

    if (runByHBuilderX) { // 由 HBuilderX 运行时,移除进度,错误
      webpackConfig.plugins.delete('progress')
      webpackConfig.plugins.delete('friendly-errors')
fxy060608's avatar
fxy060608 已提交
124 125 126 127 128 129 130 131 132 133 134 135 136 137
    } else {
      webpackConfig.plugin('friendly-errors')
        .tap(args => {
          if (global.__error_reporting__) {
            args[0].onErrors = function (severity, errors) {
              if (severity !== 'error') {
                return
              }
              const error = errors[0]
              global.__error_reporting__ && global.__error_reporting__(error.name, error.message || '')
            }
          }
          return args
        })
138
    }
fxy060608's avatar
fxy060608 已提交
139 140 141
    if (process.env.BUILD_ENV === 'ali-ide') {
      webpackConfig.plugins.delete('progress')
    }
fxy060608's avatar
fxy060608 已提交
142
  }
fxy060608's avatar
fxy060608 已提交
143
}