index.js 8.6 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1 2 3 4 5 6
const path = require('path')
const webpack = require('webpack')

const {
  parseEntry,
  getMainEntry,
fxy060608's avatar
fxy060608 已提交
7
  // normalizePath,
fxy060608's avatar
fxy060608 已提交
8 9 10 11
  getPlatformExts,
  getPlatformCssnano
} = require('@dcloudio/uni-cli-shared')

fxy060608's avatar
fxy060608 已提交
12
const WebpackUniAppPlugin = require('../../packages/webpack-uni-app-loader/plugin/index')
fxy060608's avatar
fxy060608 已提交
13

fxy060608's avatar
fxy060608 已提交
14
const modifyVueLoader = require('../vue-loader')
fxy060608's avatar
fxy060608 已提交
15

fxy060608's avatar
fxy060608 已提交
16
const {
fxy060608's avatar
fxy060608 已提交
17
  createTemplateCacheLoader
fxy060608's avatar
fxy060608 已提交
18
} = require('../cache-loader')
fxy060608's avatar
fxy060608 已提交
19

fxy060608's avatar
fxy060608 已提交
20
function createUniMPPlugin () {
21
  const WebpackUniMPPlugin = require('@dcloudio/webpack-uni-mp-loader/lib/plugin/index-new')
fxy060608's avatar
fxy060608 已提交
22 23 24 25
  return new WebpackUniMPPlugin()
}

function getProvides () {
fxy060608's avatar
fxy060608 已提交
26
  const uniPath = require('@dcloudio/uni-cli-shared/lib/platform').getMPRuntimePath()
fxy060608's avatar
fxy060608 已提交
27
  const uniCloudPath = path.resolve(__dirname, '../../packages/uni-cloud/dist/index.js')
fxy060608's avatar
fxy060608 已提交
28
  const provides = {
fxy060608's avatar
fxy060608 已提交
29 30
    uni: [uniPath, 'default'],
    uniCloud: [uniCloudPath, 'default']
fxy060608's avatar
fxy060608 已提交
31 32
  }

fxy060608's avatar
fxy060608 已提交
33 34 35 36 37
  if (process.env.UNI_USING_VUE3) {
    provides.uni = ['@dcloudio/uni-' + process.env.UNI_PLATFORM + '/dist/uni.api.esm.js', 'default']
    provides.createMiniProgramApp = [uniPath, 'createApp']
  }

fxy060608's avatar
fxy060608 已提交
38
  if (process.env.UNI_USING_COMPONENTS) {
fxy060608's avatar
fxy060608 已提交
39 40 41
    provides.createApp = [uniPath, 'createApp']
    provides.createPage = [uniPath, 'createPage']
    provides.createComponent = [uniPath, 'createComponent']
fxy060608's avatar
fxy060608 已提交
42 43 44 45 46 47
  }

  if (
    process.env.UNI_PLATFORM === 'app-plus' &&
    process.env.UNI_USING_V8
  ) {
fxy060608's avatar
fxy060608 已提交
48
    provides.__f__ = [path.resolve(__dirname, '../format-log.js'), 'default']
49

fxy060608's avatar
fxy060608 已提交
50
    const cryptoProvide = [path.resolve(__dirname, '../crypto.js'), 'default']
fxy060608's avatar
fxy060608 已提交
51
    provides.crypto = cryptoProvide
52 53
    provides['window.crypto'] = cryptoProvide
    provides['global.crypto'] = cryptoProvide
fxy060608's avatar
fxy060608 已提交
54 55 56 57 58 59 60 61
  }

  // TODO 目前依赖库 megalo 通过判断 wx 对象是否存在来识别平台做不同处理
  if (
    process.env.UNI_PLATFORM !== 'mp-qq' &&
    process.env.UNI_PLATFORM !== 'mp-weixin' &&
    process.env.UNI_PLATFORM !== 'app-plus'
  ) { // 非微信小程序,自动注入 wx 对象
fxy060608's avatar
fxy060608 已提交
62
    provides.wx = provides.uni
fxy060608's avatar
fxy060608 已提交
63 64 65 66
  }
  return provides
}

fxy060608's avatar
fxy060608 已提交
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
function processWxss (name, assets) {
  const dirname = path.dirname(name)
  const mainWxssCode = `@import "${path.relative(dirname, 'common/main.wxss')}";`
  const code = `${mainWxssCode}` + assets[name].source().toString()
  assets[name] = {
    size () {
      return Buffer.byteLength(code, 'utf8')
    },
    source () {
      return code
    }
  }
}

function procssJs (name, assets, hasVendor) {
  const dirname = path.dirname(name)
  const runtimeJsCode = `require('${path.relative(dirname, 'common/runtime.js')}');`
  const vendorJsCode = hasVendor ? `require('${path.relative(dirname, 'common/vendor.js')}');` : ''
  const mainJsCode = `require('${path.relative(dirname, 'common/main.js')}');`
  const code = `${runtimeJsCode}${vendorJsCode}${mainJsCode}` + assets[name].source().toString()
  assets[name] = {
    size () {
      return Buffer.byteLength(code, 'utf8')
    },
    source () {
      return code
    }
  }
}

fxy060608's avatar
fxy060608 已提交
97 98 99 100
class PreprocessAssetsPlugin {
  apply (compiler) {
    compiler.hooks.emit.tap('PreprocessAssetsPlugin', compilation => {
      const assets = compilation.assets
fxy060608's avatar
fxy060608 已提交
101
      const hasMainWxss = assets['common/main.wxss']
fxy060608's avatar
fxy060608 已提交
102 103 104 105 106
      const hasVendor = assets['common/vendor.js']
      Object.keys(assets).forEach(name => {
        if (name.startsWith('common')) {
          return
        }
fxy060608's avatar
fxy060608 已提交
107 108 109 110 111
        const extname = path.extname(name)
        if (extname === '.wxss' && hasMainWxss && process.UNI_ENTRY[name.replace(extname, '')]) {
          processWxss(name, assets)
        } else if (extname === '.js') {
          procssJs(name, assets, hasVendor)
fxy060608's avatar
fxy060608 已提交
112 113
        }
      })
fxy060608's avatar
fxy060608 已提交
114
      // delete assets['common/main.js']
fxy060608's avatar
fxy060608 已提交
115 116 117 118 119 120 121 122 123
      delete assets['app.js']
      delete assets['app.json']
      delete assets['app.wxss']
      delete assets['project.config.json']
    })
  }
}

function initSubpackageConfig (webpackConfig, vueOptions) {
fxy060608's avatar
fxy060608 已提交
124 125 126 127
  process.env.UNI_OUTPUT_DIR = path.resolve(process.env.UNI_OUTPUT_DIR, process.env.UNI_SUBPACKGE)
  vueOptions.outputDir = process.env.UNI_OUTPUT_DIR
  webpackConfig.output.path(process.env.UNI_OUTPUT_DIR)
  webpackConfig.output.jsonpFunction('webpackJsonp_' + process.env.UNI_SUBPACKGE)
fxy060608's avatar
fxy060608 已提交
128 129
}

fxy060608's avatar
fxy060608 已提交
130 131 132 133
module.exports = {
  vueConfig: {
    parallel: false
  },
fxy060608's avatar
fxy060608 已提交
134
  webpackConfig (webpackConfig, vueOptions, api) {
fxy060608's avatar
fxy060608 已提交
135 136 137 138 139 140 141 142 143 144
    if (!webpackConfig.optimization) {
      webpackConfig.optimization = {}
    }
    // disable noEmitOnErrors
    webpackConfig.optimization.noEmitOnErrors = false

    webpackConfig.optimization.runtimeChunk = {
      name: 'common/runtime'
    }

fxy060608's avatar
fxy060608 已提交
145
    webpackConfig.optimization.splitChunks = require('../split-chunks')()
fxy060608's avatar
fxy060608 已提交
146 147 148

    parseEntry()

fxy060608's avatar
fxy060608 已提交
149
    const statCode = process.env.UNI_USING_STAT ? 'import \'@dcloudio/uni-stat\';' : ''
fxy060608's avatar
fxy060608 已提交
150

fxy060608's avatar
fxy060608 已提交
151
    const beforeCode = 'import \'uni-pages\';'
fxy060608's avatar
fxy060608 已提交
152 153 154 155 156 157 158 159 160 161

    const plugins = [
      new WebpackUniAppPlugin(),
      createUniMPPlugin(),
      new webpack.ProvidePlugin(getProvides())
    ]

    if (process.env.UNI_SUBPACKGE && process.env.UNI_SUBPACKGE !== 'main') {
      plugins.push(new PreprocessAssetsPlugin())
    }
fxy060608's avatar
fxy060608 已提交
162 163

    return {
fxy060608's avatar
fxy060608 已提交
164
      mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
fxy060608's avatar
fxy060608 已提交
165 166 167 168 169 170
      entry () {
        return process.UNI_ENTRY
      },
      output: {
        filename: '[name].js',
        chunkFilename: '[id].js',
fxy060608's avatar
fxy060608 已提交
171 172
        globalObject: process.env.UNI_PLATFORM === 'mp-alipay' ? 'my' : 'global'
        // sourceMapFilename: '../.sourcemap/' + process.env.UNI_PLATFORM + '/[name].js.map'
fxy060608's avatar
fxy060608 已提交
173 174 175
      },
      performance: {
        hints: false
fxy060608's avatar
fxy060608 已提交
176 177 178 179 180 181 182 183 184 185 186 187
      },
      resolve: {
        extensions: ['.nvue'],
        alias: { // 仅 mp-weixin
          'mpvue-page-factory': require.resolve(
            '@dcloudio/vue-cli-plugin-uni/packages/mpvue-page-factory')
        }
      },
      module: {
        rules: [{
          test: path.resolve(process.env.UNI_INPUT_DIR, getMainEntry()),
          use: [{
188
            loader: path.resolve(__dirname, '../../packages/wrap-loader'),
fxy060608's avatar
fxy060608 已提交
189 190
            options: {
              before: [
fxy060608's avatar
fxy060608 已提交
191
                beforeCode + require('../util').getAutomatorCode() + statCode
fxy060608's avatar
fxy060608 已提交
192 193 194
              ]
            }
          }, {
fxy060608's avatar
fxy060608 已提交
195 196 197 198 199 200 201 202 203 204 205
            loader: '@dcloudio/webpack-uni-mp-loader/lib/main'
          }]
        }, {
          resourceQuery: /vue&type=script/,
          use: [{
            loader: '@dcloudio/webpack-uni-mp-loader/lib/script'
          }]
        }, {
          resourceQuery: /vue&type=template/,
          use: [{
            loader: '@dcloudio/webpack-uni-mp-loader/lib/template'
206 207
          }, {
            loader: '@dcloudio/vue-cli-plugin-uni/packages/webpack-uni-app-loader/page-meta'
fxy060608's avatar
fxy060608 已提交
208
          }]
fxy060608's avatar
fxy060608 已提交
209
        }, createTemplateCacheLoader(api), {
fxy060608's avatar
fxy060608 已提交
210 211 212
          resourceQuery: [
            /lang=wxs/,
            /lang=filter/,
fxy060608's avatar
fxy060608 已提交
213
            /lang=sjs/,
fxy060608's avatar
fxy060608 已提交
214 215
            /blockType=wxs/,
            /blockType=filter/,
fxy060608's avatar
fxy060608 已提交
216
            /blockType=sjs/
fxy060608's avatar
fxy060608 已提交
217
          ],
fxy060608's avatar
fxy060608 已提交
218 219 220 221
          use: [{
            loader: require.resolve(
              '@dcloudio/vue-cli-plugin-uni/packages/webpack-uni-filter-loader')
          }]
fxy060608's avatar
fxy060608 已提交
222 223
        }]
      },
fxy060608's avatar
fxy060608 已提交
224
      plugins
fxy060608's avatar
fxy060608 已提交
225 226
    }
  },
fxy060608's avatar
fxy060608 已提交
227
  chainWebpack (webpackConfig, vueOptions, api) {
fxy060608's avatar
fxy060608 已提交
228 229 230 231 232 233 234
    if (process.env.UNI_PLATFORM === 'mp-baidu') {
      webpackConfig.module
        .rule('js')
        .exclude
        .add(/\.filter\.js$/)
    }

fxy060608's avatar
fxy060608 已提交
235
    const compilerOptions = process.env.UNI_USING_COMPONENTS ? {} : require('../mp-compiler-options')
fxy060608's avatar
fxy060608 已提交
236

237
    modifyVueLoader(webpackConfig, {}, compilerOptions, api)
fxy060608's avatar
fxy060608 已提交
238

fxy060608's avatar
fxy060608 已提交
239 240
    const styleExt = getPlatformExts().style

fxy060608's avatar
fxy060608 已提交
241 242
    webpackConfig.plugin('extract-css')
      .init((Plugin, args) => new Plugin({
fxy060608's avatar
fxy060608 已提交
243
        filename: '[name]' + styleExt
fxy060608's avatar
fxy060608 已提交
244 245
      }))

fxy060608's avatar
fxy060608 已提交
246 247 248 249
    if (
      process.env.NODE_ENV === 'production' &&
      process.env.UNI_PLATFORM !== 'app-plus'
    ) {
fxy060608's avatar
fxy060608 已提交
250
      const OptimizeCssnanoPlugin = require('../../packages/@intervolga/optimize-cssnano-plugin/index.js')
fxy060608's avatar
fxy060608 已提交
251
      webpackConfig.plugin('optimize-css')
fxy060608's avatar
fxy060608 已提交
252
        .init((Plugin, args) => new OptimizeCssnanoPlugin({
fxy060608's avatar
fxy060608 已提交
253
          sourceMap: false,
fxy060608's avatar
fxy060608 已提交
254 255 256
          filter (assetName) {
            return path.extname(assetName) === styleExt
          },
fxy060608's avatar
fxy060608 已提交
257 258 259
          cssnanoOptions: {
            preset: [
              'default',
fxy060608's avatar
fxy060608 已提交
260 261 262
              Object.assign({}, getPlatformCssnano(), {
                discardComments: true
              })
fxy060608's avatar
fxy060608 已提交
263 264 265 266 267 268
            ]
          }

        }))
    }

fxy060608's avatar
fxy060608 已提交
269 270 271 272
    if (process.env.UNI_SUBPACKGE) {
      initSubpackageConfig(webpackConfig, vueOptions)
    }

fxy060608's avatar
fxy060608 已提交
273 274 275 276 277 278
    webpackConfig.plugins.delete('hmr')
    webpackConfig.plugins.delete('html')
    webpackConfig.plugins.delete('copy')
    webpackConfig.plugins.delete('preload')
    webpackConfig.plugins.delete('prefetch')
  }
fxy060608's avatar
fxy060608 已提交
279
}