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

const {
  getMainEntry,
fxy060608's avatar
fxy060608 已提交
7
  getH5Options
fxy060608's avatar
fxy060608 已提交
8 9
} = require('@dcloudio/uni-cli-shared')

fxy060608's avatar
fxy060608 已提交
10 11 12 13
const {
  getGlobalUsingComponentsCode
} = require('@dcloudio/uni-cli-shared/lib/pages')

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

fxy060608's avatar
fxy060608 已提交
16 17
const WebpackHtmlAppendPlugin = require('../../packages/webpack-html-append-plugin')

fxy060608's avatar
fxy060608 已提交
18
function resolve (dir) {
fxy060608's avatar
fxy060608 已提交
19 20 21 22 23 24 25 26 27 28
  return path.resolve(__dirname, '../../', dir)
}

const {
  title,
  publicPath,
  template,
  devServer
} = getH5Options()

fxy060608's avatar
fxy060608 已提交
29
const runtimePath = '@dcloudio/uni-mp-weixin/dist/mp.js'
fxy060608's avatar
fxy060608 已提交
30
const wxsPath = '@dcloudio/uni-mp-weixin/dist/wxs.js'
fxy060608's avatar
fxy060608 已提交
31

fxy060608's avatar
fxy060608 已提交
32
function getProvides () {
33
  return {
fxy060608's avatar
fxy060608 已提交
34
    'wx.nextTick': [runtimePath, 'nextTick'],
fxy060608's avatar
fxy060608 已提交
35 36 37
    'Page': [runtimePath, 'Page'],
    'Component': [runtimePath, 'Component'],
    'Behavior': [runtimePath, 'Behavior'],
fxy060608's avatar
fxy060608 已提交
38 39
    'getDate': [wxsPath, 'getDate'],
    'getRegExp': [wxsPath, 'getRegExp']
fxy060608's avatar
fxy060608 已提交
40 41 42 43 44 45
  }
}

const plugins = [
  new webpack.ProvidePlugin(getProvides())
]
fxy060608's avatar
fxy060608 已提交
46 47 48 49 50 51 52 53 54 55 56 57 58

if (process.env.NODE_ENV !== 'production') {
  plugins.push(new WebpackHtmlAppendPlugin(
    `
        <script>
        ${fs.readFileSync(path.resolve(__dirname, './auto-reload.js'), 'utf8')}
        </script>
        `
  ))
}

const vueConfig = {
  parallel: false, // 因为传入了自定义 compiler,避免参数丢失,禁用parallel
59 60 61 62
  publicPath,
  transpileDependencies: [
    wxsPath,
    runtimePath
fxy060608's avatar
fxy060608 已提交
63
  ],
fxy060608's avatar
fxy060608 已提交
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
  pages: {
    index: {
      // page 的入口
      entry: path.resolve(process.env.UNI_INPUT_DIR, getMainEntry()),
      // 模板来源
      template,
      // 在 dist/index.html 的输出
      filename: 'index.html',
      // 当使用 title 选项时,
      // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>
      title,
      // 在这个页面中包含的块,默认情况下会包含
      // 提取出来的通用 chunk 和 vendor chunk。
      chunks: ['chunk-vendors', 'chunk-common', 'index'],
      baseUrl: publicPath
    }
  }
}

if (devServer && Object.keys(devServer).length) {
  vueConfig.devServer = devServer
}

module.exports = {
  vueConfig,
fxy060608's avatar
fxy060608 已提交
89
  webpackConfig (webpackConfig) {
fxy060608's avatar
fxy060608 已提交
90 91 92 93 94 95 96 97 98 99 100 101
    let useBuiltIns = 'usage'

    const statCode = process.env.UNI_USING_STAT ? `import '@dcloudio/uni-stat';` : ''

    try {
      const babelConfig = require(path.resolve(process.env.UNI_CLI_CONTEXT, 'babel.config.js'))
      useBuiltIns = babelConfig.presets[0][1].useBuiltIns
    } catch (e) {}

    const beforeCode = (useBuiltIns === 'entry' ? `import '@babel/polyfill';` : '') +
      `import 'uni-pages';import 'uni-${process.env.UNI_PLATFORM}';`

fxy060608's avatar
fxy060608 已提交
102 103 104 105 106 107 108 109 110 111 112
    return {
      devtool: process.env.NODE_ENV === 'production' ? false : 'source-map',
      resolve: {
        extensions: ['.nvue'],
        alias: {
          'vue-router': resolve('packages/h5-vue-router'),
          'uni-h5': require.resolve('@dcloudio/uni-h5')
        }
      },
      module: {
        rules: [{
fxy060608's avatar
fxy060608 已提交
113 114 115 116 117
          test: path.resolve(process.env.UNI_INPUT_DIR, getMainEntry()),
          use: [{
            loader: 'wrap-loader',
            options: {
              before: [
fxy060608's avatar
fxy060608 已提交
118
                beforeCode + statCode + getGlobalUsingComponentsCode()
fxy060608's avatar
fxy060608 已提交
119 120 121 122
              ]
            }
          }]
        }, {
fxy060608's avatar
fxy060608 已提交
123 124 125 126 127 128 129
          test: /App\.vue$/,
          use: {
            loader: 'wrap-loader',
            options: {
              before: [`<template><App :keepAliveInclude="keepAliveInclude"/></template>`]
            }
          }
fxy060608's avatar
fxy060608 已提交
130 131 132 133 134 135
        }, { // 解析组件,css 等
          resourceQuery: /vue&type=script/,
          use: [{
            loader: path.resolve(__dirname,
              '../../packages/webpack-uni-app-loader/using-components')
          }]
fxy060608's avatar
fxy060608 已提交
136 137 138
        }, {
          resourceQuery: /vue&type=template/,
          use: [{
fxy060608's avatar
fxy060608 已提交
139
            loader: resolve('packages/webpack-uni-app-loader/filter-modules-template.js')
140 141
          }, {
            loader: '@dcloudio/vue-cli-plugin-uni/packages/webpack-uni-app-loader/page-meta'
fxy060608's avatar
fxy060608 已提交
142
          }]
fxy060608's avatar
fxy060608 已提交
143
        }, {
fxy060608's avatar
fxy060608 已提交
144
          resourceQuery: [/lang=wxs/, /blockType=wxs/],
fxy060608's avatar
fxy060608 已提交
145 146 147
          use: [{
            loader: resolve('packages/webpack-uni-filter-loader')
          }]
fxy060608's avatar
fxy060608 已提交
148
        }]
149 150 151 152 153
      },
      resolveLoader: {
        alias: {
          'vue-style-loader': resolve('packages/h5-vue-style-loader')
        }
fxy060608's avatar
fxy060608 已提交
154 155 156 157
      },
      plugins
    }
  },
fxy060608's avatar
fxy060608 已提交
158
  chainWebpack (webpackConfig, vueOptions, api) {
fxy060608's avatar
fxy060608 已提交
159 160 161 162 163 164 165 166
    webpackConfig.plugins.delete('copy')

    if (!process.env.UNI_OPT_PREFETCH) {
      webpackConfig.plugins.delete('prefetch-index')
    }
    if (!process.env.UNI_OPT_PRELOAD) {
      webpackConfig.plugins.delete('preload-index')
    }
fxy060608's avatar
fxy060608 已提交
167 168

    modifyVueLoader(webpackConfig, require('./compiler-options'), api)
fxy060608's avatar
fxy060608 已提交
169 170

    if (process.env.NODE_ENV === 'production') {
fxy060608's avatar
fxy060608 已提交
171
      require('./cssnano-options')(webpackConfig)
fxy060608's avatar
fxy060608 已提交
172 173 174
    }
  }
}