Vue的webpack2.0升级到webpack4.0解决方案(utils篇)

994 阅读1分钟

由于项目最开始使用了vuecli脚手架搭建项目,webpack版本为2.0。后续由于项目引入插件需要支持webpack4.0。所以有了这次升级篇,我先来看看Vue的webpack

webpack目录

  • utils.js
  • webpack.dev.js
  • webpack.base.js
  • webpack.prod.js

utils.js

附上升级后的utils.js

将extract-text-webpack-plugin 换成mini-css-extract-plugin

generateLoaders

这里是配置loader的地方,在webpack的rules有加入。如果嫌麻烦可以去掉Vue的这一块。当然这里我是在原来的基础上改造,

   function generateLoaders(loader, loaderOptions) {
        const loaders = options.usePostCSS ? [MiniCssExtractPlugin.loader, cssLoader, postcssLoader] : [cssLoader]

        if (loader) {
            loaders.push({
                loader: loader + '-loader',
                options: Object.assign({}, loaderOptions, {
                    sourceMap: options.sourceMap
                })
            })
        }
     return ['vue-style-loader'].concat(loaders)

    }

完整代码

'use strict'
const path = require('path')
const config = require('../config')
    // const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')

exports.assetsPath = function(_path) {
    const assetsSubDirectory = process.env.NODE_ENV === 'production' ?
        config.build.assetsSubDirectory :
        config.dev.assetsSubDirectory

    return path.posix.join(assetsSubDirectory, _path)
}

exports.cssLoaders = function(options) {
    options = options || {}

    const cssLoader = {
        loader: 'css-loader',
        options: {
            sourceMap: options.sourceMap
        }
    }

    const postcssLoader = {
        loader: 'postcss-loader',
        options: {
            sourceMap: options.sourceMap
        }
    }

    // generate loader string to be used with extract text plugin
    function generateLoaders(loader, loaderOptions) {
        const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]

        if (loader) {
            loaders.push({
                loader: loader + '-loader',
                options: Object.assign({}, loaderOptions, {
                    sourceMap: options.sourceMap
                })
            })
        }

        // Extract CSS when that option is specified
        // (which is the case during production build)
        return ['vue-style-loader'].concat(loaders)
            // if (options.extract) {
            //   return ExtractTextPlugin.extract({
            //     use: loaders,
            //     fallback: 'vue-style-loader'
            //   })
            // } else {
            //   return ['vue-style-loader'].concat(loaders)
            // }
    }

    // https://vue-loader.vuejs.org/en/configurations/extract-css.html
    return {
        css: generateLoaders(),
        postcss: generateLoaders(),
        less: generateLoaders('less'),
        sass: generateLoaders('sass', { indentedSyntax: true }),
        scss: generateLoaders('sass'),
        stylus: generateLoaders('stylus'),
        styl: generateLoaders('stylus')
    }
}

// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function(options) {
    const output = []
    const loaders = exports.cssLoaders(options)

    for (const extension in loaders) {
        const loader = loaders[extension]
        output.push({
            test: new RegExp('\\.' + extension + '$'),
            use: loader
        })
    }

    return output
}

exports.createNotifierCallback = () => {
    const notifier = require('node-notifier')

    return (severity, errors) => {
        if (severity !== 'error') return

        const error = errors[0]
        const filename = error.file && error.file.split('!').pop()

        notifier.notify({
            title: packageConfig.name,
            message: severity + ': ' + error.name,
            subtitle: filename || '',
            icon: path.join(__dirname, 'logo.png')
        })
    }
}

至此,关于Utils篇的修改就结束了,有什么问题欢迎反馈质询哦。后续有新的优化也会新增帖子。