vue2升级vue3:webpack vue-loader 打包配置

如果没有啥特别的需求还是推荐vue-cli!

vite  vue3 TSX项目

虽然vite 很香,但是vite  rollup 动态加载,多页面 等问题比较难搞

vite的缺点

wepback  __webpack_public_path__ 没有找到好的实践方案。

__webpack_public_path__ = window.BK_STATIC_URL;

第二个,动态加载css 里面的资源

/**

 * @file 替换 asset css 中的 BK_STATIC_URL,__webpack_public_path__ 没法解决 asset 里静态资源的 url

 * @author

 */

const { extname } = require('path');

class ReplaceCSSStaticUrlPlugin {

  apply(compiler) {

    // emit: 在生成资源并输出到目录之前

    compiler.hooks.emit.tapAsync('ReplaceCSSStaticUrlPlugin', (compilation, callback) => {

      const assets = Object.keys(compilation.assets);

      const assetsLen = assets.length;

      for (let i = 0; i < assetsLen; i++) {

        const fileName = assets[i];

        const name = extname(fileName);

        if (extname(fileName) !== '.css') {

          continue;

        }

        const asset = compilation.assets[fileName];

        let minifyFileContent = asset.source().toString()

          .replace(

            /\{\{\s*BK_STATIC_URL\s*\}\}/g,

            () => '../',

          );

        compilation.assets[fileName] = {

          // 返回文件内容

          source: () => minifyFileContent,

          // 返回文件大小

          size: () => Buffer.byteLength(minifyFileContent, 'utf8'),

        };

      }

      callback();

    });

  }

}

module.exports = ReplaceCSSStaticUrlPlugin;

虽然有 vite-plugin-dynamic-publicpath 等插件,但是并不是非常好使

多页面配置,主要还是修改rollup配置

build: {

  assetsDir: 'assets', // 指定生成静态资源的存放路径

  rollupOptions: {

      input: {

        admin: path.resolve(__dirname, 'src/index.html'),

        page: path.resolve(__dirname, 'src/page/index.html'),

        index: path.resolve(__dirname, 'src/index/index.html'),

      },

      output: {

        chunkFileNames: 'static/js/[name]-[hash].js',

        entryFileNames: 'static/js/[name]-[hash].js',

        assetFileNames: 'static/[ext]/[name]-[hash].[ext]',

      }

    },

}

多页面更多的资料,网上很多,这里推荐几篇文章:

vue+vite多页应用配置及页面路径更改 https://juejin.cn/post/7004784113706090526

Vite 入门以及从 webpack 切换到 Vite 遇到的问题总结 https://jishuin.proginn.com/p/763bfbd4f55a

多页面貌似解决了,当rollup 打包完成后,都在二级目录,虽然有办法解决,但是一路搞下来,不想在折腾了

想来想去还是webpack 原有配置方便

webpack vue3 TSX

只需要升级npm 包:vue-loader vue-template-compiler"

vue-loader:它是基于 webpack 的一个的 loader 插件,解析和转换 .vue  文件,提取出其中的逻辑代码 script、样式代码 style、以及 HTML 模版 template,再分别把它们交给对应的 loader 去处理如 style-loader 、 less-loader 等等,核心的作用,就是 提取 。

@vue/compiler-sfc: Vue 2.x 时代,需要 vue-template-compiler 插件处理 .vue 内容为 ast , Vue 3.x 则变成 @vue/compiler-sfc 。

vue-loader 需要注意

之前的

import VueLoaderPlugin  from 'vue-loader/lib/plugin';

新的

import { VueLoaderPlugin }  from 'vue-loader';

VueLoaderPlugin 的职责是将你定义过的其它规则复制并应用到 .vue 文件里相应语言的块。例如,如果你有一条匹配 /\.js$/ 的规则,那么它会应用到 .vue 文件里的 <script> 块。

转换jsx

需要安装https://github.com/vuejs/babel-plugin-jsx

关于tsx,具体推荐阅读:重拳出击:打造 Vue3.0 + Typescript + TSX 开(乞)发(丐)模式https://juejin.cn/post/6844904054103998477

module.exports = function({ types: t }) {

  const buildAttrsCall = (attribs, t) => {

    const props = []

    attribs.forEach(attr => {

      const name = attr.name.name

      const value = attr.value

      !t.isJSXExpressionContainer(value) &&

      props.push(t.objectProperty(t.stringLiteral(name), value))

      t.isJSXExpressionContainer(value) &&

      props.push(t.objectProperty(t.stringLiteral(name), value.expression))

    })


    return t.ObjectExpression(props)

  }


  const jsxVisitor = {

    JSXElement: {

      exit(path, state) {      

        // 获取 jsx 

        const openingPath = path.get("openingElement")

        const children = t.react.buildChildren(openingPath.parent)


        const tagNode = t.react.isCompatTag(openingPath.node.name.name)

          ? t.stringLiteral(openingPath.node.name.name)

          : t.identifier(openingPath.node.name.name)


        // 创建 Vue h

        const createElement = t.identifier('h')

        const attrs = buildAttrsCall(openingPath.node.attributes, t)

        // 创建 h(tag,{...attrs}, [chidren])

        const callExpr = t.callExpression(createElement, [tagNode, attrs, t.arrayExpression(children)])

        path.replaceWith(t.inherits(callExpr, path.node))

      }

    },

    JSXAttribute(path) {

      if (t.isJSXElement(path.node.value)) {

        path.node.value = t.jsxExpressionContainer(path.node.value);

      }

    },

    Program: {

      exit(path, state) {


        const hasImportedVue = (path) => {

          return path.node.body.filter(p => p.type === 'ImportDeclaration').some(p => p.source.value == 'vue')

        }

        // 注入 h 函数

        if (path.node.start === 0) {

          if (!hasImportedVue(path)) {

            path.node.body.unshift(

              t.importDeclaration(

                [t.ImportSpecifier(t.identifier('h'), t.identifier('h'))],

                t.stringLiteral('vue')

              )

            )

          } else {

            const vueSource = path.node.body

              .filter(p => p.type === 'ImportDeclaration')

              .find(p => p.source.value == 'vue')

            const key = vueSource.specifiers.map(s => s.imported.name)

            if (key.includes('h')) {

            } else {

              vueSource.specifiers.unshift(t.ImportSpecifier(t.identifier('h'), t.identifier('h')))

            }

          }

        }

      }

    }

  }


  return {

    visitor: jsxVisitor,

    inherits:() => {

      return {

        manipulateOptions(opts, parserOpts) {

          parserOpts.plugins.push("jsx")

        }

      }

    }

  }

}

这段时间做bk-vision 项目,分别试过 

vite

vue-cli

webpack

最后还是升级了 bkui-cli,vue2 升级vue3,打包工具还是不要变为好。

https://github.com/zhoulujun/bkui-cli

参考文章:

Vue 3 和 Webpack 5 来了,手动搭建的知识该更新了 https://juejin.cn/post/6921161482663100423

打造 Vue3.0 + Typescript + TSX 开(乞)发(丐)模式https://juejin.cn/post/6844904054103998477

转载本站文章《vue2升级vue3:webpack vue-loader 打包配置》,

请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/vue3/8852.html

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

推荐阅读更多精彩内容