123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- module.exports = (api, options) => {
- api.chainWebpack(webpackConfig => {
- const isLegacyBundle = process.env.VUE_CLI_MODERN_MODE && !process.env.VUE_CLI_MODERN_BUILD
- const resolveLocal = require('../util/resolveLocal')
- const getAssetPath = require('../util/getAssetPath')
- const inlineLimit = 4096
- const genAssetSubPath = dir => {
- return getAssetPath(
- options,
- `${dir}/[name]${options.filenameHashing ? '.[hash:8]' : ''}.[ext]`
- )
- }
- const genUrlLoaderOptions = dir => {
- return {
- limit: inlineLimit,
- // use explicit fallback to avoid regression in url-loader>=1.1.0
- fallback: {
- loader: 'file-loader',
- options: {
- name: genAssetSubPath(dir)
- }
- }
- }
- }
- webpackConfig
- .mode('development')
- .context(api.service.context)
- .entry('app')
- .add('./src/main.js')
- .end()
- .output
- .path(api.resolve(options.outputDir))
- .filename(isLegacyBundle ? '[name]-legacy.js' : '[name].js')
- .publicPath(options.publicPath)
- webpackConfig.resolve
- .extensions
- .merge(['.mjs', '.js', '.jsx', '.vue', '.json', '.wasm'])
- .end()
- .modules
- .add('node_modules')
- .add(api.resolve('node_modules'))
- .add(resolveLocal('node_modules'))
- .end()
- .alias
- .set('@', api.resolve('src'))
- .set(
- 'vue$',
- options.runtimeCompiler
- ? 'vue/dist/vue.esm.js'
- : 'vue/dist/vue.runtime.esm.js'
- )
- webpackConfig.resolveLoader
- .modules
- .add('node_modules')
- .add(api.resolve('node_modules'))
- .add(resolveLocal('node_modules'))
- webpackConfig.module
- .noParse(/^(vue|vue-router|vuex|vuex-router-sync)$/)
- // js is handled by cli-plugin-babel ---------------------------------------
- // vue-loader --------------------------------------------------------------
- const vueLoaderCacheConfig = api.genCacheConfig('vue-loader', {
- 'vue-loader': require('vue-loader/package.json').version,
- /* eslint-disable-next-line node/no-extraneous-require */
- '@vue/component-compiler-utils': require('@vue/component-compiler-utils/package.json').version,
- 'vue-template-compiler': require('vue-template-compiler/package.json').version
- })
- webpackConfig.module
- .rule('vue')
- .test(/\.vue$/)
- .use('cache-loader')
- .loader('cache-loader')
- .options(vueLoaderCacheConfig)
- .end()
- .use('vue-loader')
- .loader('vue-loader')
- .options(Object.assign({
- compilerOptions: {
- preserveWhitespace: false
- }
- }, vueLoaderCacheConfig))
- webpackConfig
- .plugin('vue-loader')
- .use(require('vue-loader/lib/plugin'))
- // static assets -----------------------------------------------------------
- webpackConfig.module
- .rule('images')
- .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
- .use('url-loader')
- .loader('url-loader')
- .options(genUrlLoaderOptions('img'))
- // do not base64-inline SVGs.
- // https://github.com/facebookincubator/create-react-app/pull/1180
- webpackConfig.module
- .rule('svg')
- .test(/\.(svg)(\?.*)?$/)
- .use('file-loader')
- .loader('file-loader')
- .options({
- name: genAssetSubPath('img')
- })
- webpackConfig.module
- .rule('media')
- .test(/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/)
- .use('url-loader')
- .loader('url-loader')
- .options(genUrlLoaderOptions('media'))
- webpackConfig.module
- .rule('fonts')
- .test(/\.(woff2?|eot|ttf|otf)(\?.*)?$/i)
- .use('url-loader')
- .loader('url-loader')
- .options(genUrlLoaderOptions('fonts'))
- // Other common pre-processors ---------------------------------------------
- webpackConfig.module
- .rule('pug')
- .test(/\.pug$/)
- .oneOf('pug-vue')
- .resourceQuery(/vue/)
- .use('pug-plain-loader')
- .loader('pug-plain-loader')
- .end()
- .end()
- .oneOf('pug-template')
- .use('raw')
- .loader('raw-loader')
- .end()
- .use('pug-plain')
- .loader('pug-plain-loader')
- .end()
- .end()
- // shims
- webpackConfig.node
- .merge({
- // prevent webpack from injecting useless setImmediate polyfill because Vue
- // source contains it (although only uses it if it's native).
- setImmediate: false,
- // prevent webpack from injecting mocks to Node native modules
- // that does not make sense for the client
- dgram: 'empty',
- fs: 'empty',
- net: 'empty',
- tls: 'empty',
- child_process: 'empty'
- })
- const resolveClientEnv = require('../util/resolveClientEnv')
- webpackConfig
- .plugin('define')
- .use(require('webpack/lib/DefinePlugin'), [
- resolveClientEnv(options)
- ])
- webpackConfig
- .plugin('case-sensitive-paths')
- .use(require('case-sensitive-paths-webpack-plugin'))
- // friendly error plugin displays very confusing errors when webpack
- // fails to resolve a loader, so we provide custom handlers to improve it
- const { transformer, formatter } = require('../util/resolveLoaderError')
- webpackConfig
- .plugin('friendly-errors')
- .use(require('@soda/friendly-errors-webpack-plugin'), [{
- additionalTransformers: [transformer],
- additionalFormatters: [formatter]
- }])
- })
- }
|