记项目升级详细记录——vue项目升级到webpack4、babel7版本

项目升级目标:

原版项目:vue2+webpack3+babel6

升级项目:vue2+webpack4+babel7

最近需要将vue项目升级,以获得更好的构建性能和开发便利,由于网上没有一个可以参考的实用用性文章,故此将升级项目过程记录并分享给各位,希望对各位有用。也欢迎关注本人的公众号:==前端学海==

根据多次尝试总结出的经验,先升级与webpack无关的组件,然后再升级webpack,注意webpack不同的版本需要的webpack-cli也不同,否则会产生兼容报错,切记!!!

最好按照一下给出的升级顺序进行,每个包后面的版本为我升级成功的包的版本,大部分是我升级时的最高稳定版,给位可以根据自己的需要,升级到指定版本。小心升级哦~

项目包的升级和卸载:

babel部分:

(1)babel-core卸载掉,从新安装@babel/core

npm un babel-core // 卸载 不然不同版本的core会发生冲突,构建失败

npm i -D @babel/core // 重新安装babel7的core

npm i -D babel-loader@8.1.0 // babel7需要babel-loader8以上的版本,否则报错

npm i -D @babel/polyfill  "@babel/polyfill": "^7.10.1",

npm i -D @babel/runtime  "@babel/runtime": "^7.10.2",

npm i -D @babel/plugin-transform-runtime "@babel/plugin-transform-runtime": "^7.10.1",

npm i -D @babel/preset-env "@babel/preset-env": "^7.10.2",

// 安装后,卸载不需要的babel6的相关插件,进行.babelrc 的文件配置

{

  "presets": [

    ["@babel/env", { // babel7的写法,

      "targets": {

        "edge": "17",

        "firefox": "60",

        "chrome": "67",

        "safari": "11.1"

      },

      "corejs": "2", // 指定编译的corejs版本,否则构建线上环境时会报警告

      "useBuiltIns": "usage"

    }]

  ],

  "plugins": ["transform-vue-jsx", "@babel/plugin-transform-runtime"]

}

// 如果编译报错:

this.setDynamic is not a function

Cannot find module '@transform-runtime/babel-plugin'

// 诸如此类,大部分均为部分配置写法未从babel6转为babel7的写法问题

到这里基本的babel的替换完成,项目启动成功

webpack部分:

注意:webpck4,需要升级其他包,否则webpack4不支持,会运行报错,如

webpack-dev-server、vue-loader 15版本以上html-webpack-plugin最新版 stylus-loader最新版

1、安装全局webpack-cli cnpm install webpack-cli -g

2、安装项目webpack-cli cnpm install --save-dev webpack-cli

3、升级webpack npm install webpack@4.43.0 -D

4、升级 webpack-dev-server cnpm install webpack-dev-server@3.1.14 -D // webpack4需要webpack-dev-server 3以上的版本,否则不兼容会报错

5、升级vue-loader cnpm install vue-loader@15.0.0 -D

6、cnpm install html-webpack-plugin@3.2.0 -D

7、安装mini-css-extract-plugin -D 替换卸载 extract-text-webpack-plugin

8、升级 stylus-loader cnpm i stylus-loader@3.0.2 -D 最新版本

修改原项目的配置,和删除废弃的插件配置:

1、utils.js

// const ExtractTextPlugin = require('extract-text-webpack-plugin') // dl删除

const MiniCssExtractPlugin = require('mini-css-extract-plugin') // dl新增

if (options.extract) {

      // return ExtractTextPlugin.extract({ dl 删除

      //  use: loaders,

      //  fallback: 'vue-style-loader',

      //  publicPath: '../../'

      // })

      return [MiniCssExtractPlugin.loader].concat(loaders) // dl新增

    } else {

      return ['vue-style-loader'].concat(loaders)

    }

2、webpack.dev.conf.js

const { VueLoaderPlugin } = require('vue-loader') // dl新增

mode: 'development', // 新增

new VueLoaderPlugin(), //dl新增

3、webpack.base.conf.js

{

      test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,

      loader: 'url-loader',

      exclude: /node_modules/,

      options: {

        limit: 10000,

        publicPath: '../../', // 添加路径,否则element icon图标路径不对,打包后不显示,

        name: utils.assetsPath('fonts/[name].[hash:7].[ext]')

      }

    },

4、webpack.prod.conf

const { VueLoaderPlugin } = require('vue-loader') // dl新增

const MiniCssExtractPlugin = require('mini-css-extract-plugin') // dl 新增

// const ExtractTextPlugin = require('extract-text-webpack-plugin') // dl 删除

mode: 'production', // 新增

optimization: { // dl新增

    runtimeChunk: {

      name: 'manifest'

    },

    minimizer: [

      new UglifyJsPlugin({

        cache: true,

        parallel: true,

        sourceMap: config.build.productionSourceMap,

        uglifyOptions: {

          warnings: false

        }

      }),

      new OptimizeCSSPlugin({

        cssProcessorOptions: config.build.productionSourceMap

          ? { safe: true, map: { inline: false } }

          : { safe: true }

      }),

    ],

    splitChunks: {

      chunks: 'async',

      minSize: 30000,

      minChunks: 1,

      maxAsyncRequests: 5,

      maxInitialRequests: 3,

      name: false,

      cacheGroups: {

        vendors: {

          test: /[\\/]node_modules[\\/]/,

          name: 'vendor',

          chunks: 'initial',

          priority: -10

        }

      }

    }

  },

  plugins: [

      new VueLoaderPlugin(), //dl新增

      // new ExtractTextPlugin({ dl--删除

    //  filename: utils.assetsPath('css/[name].[contenthash].css'),

    //  // Setting the following option to `false` will not extract CSS from codesplit chunks.

    //  // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.

    //  // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,

    //  // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110

    //  allChunks: true,

    // }),

    new MiniCssExtractPlugin({ // dl 新增

      filename: utils.assetsPath('css/[name].css'),

      chunkFilename: utils.assetsPath('css/[name].[contenthash].css')

    }),

    //--------------------dl 删除

    // new webpack.optimize.CommonsChunkPlugin({

    //  name: 'vendor',

    //  minChunks (module) {

    //    // any required modules inside node_modules are extracted to vendor

    //    return (

    //      module.resource &&

    //      /\.js$/.test(module.resource) &&

    //      module.resource.indexOf(

    //        path.join(__dirname, '../node_modules')

    //      ) === 0

    //    )

    //  }

    // }),

    // // extract webpack runtime and module manifest to its own file in order to

    // // prevent vendor hash from being updated whenever app bundle is updated

    // new webpack.optimize.CommonsChunkPlugin({

    //  name: 'manifest',

    //  minChunks: Infinity

    // }),

    // // This instance extracts shared chunks from code splitted chunks and bundles them

    // // in a separate chunk, similar to the vendor chunk

    // // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk

    // new webpack.optimize.CommonsChunkPlugin({

    //  name: 'app',

    //  async: 'vendor-async',

    //  children: true,

    //  minChunks: 3

    // }),

  ]



可能会报错:

Cannot find module 'webpack-cli/bin/config-yargs'

直接删除node_modul包,重新下载即可

我的项目到这里就运行正常了,仅仅是对vue-cli脚手架的基本配置进行升级,也没有什么大的优化,只是升级,基本满足一般的项目使用,

后期开始进行逐个优化,个人建议:一定要先升级完babel,再来升级webpack, 根据我之前几次失败的折腾总结的经验。


后面一篇文章,会分享我升级后的vue项目的具体优化步骤,升级了哪些?有什么作用?效果怎样?

欢迎各位批评指正!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352