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
vue2升级vue3:webpack vue-loader 打包配置的更多相关文章
- vue2升级vue3:Vue Demij打通vue2与vue3壁垒,构建通用组件
如果你的vue2代码之前是使用vue-class-component 类组件模式写的.选择可以使用 https://github.com/facing-dev/vue-facing-decorator ...
- vue2升级vue3指南(二)—— 语法warning&error篇
本文总结了vue2升级vue3可能会遇到的语法警告和错误,如果想知道怎样升级,可以查看我的上一篇文章:vue2升级vue3指南(一)-- 环境准备和构建篇 Warning 1.deep /deep/和 ...
- vue2升级vue3:vue2 vue-i18n 升级到vue3搭配VueI18n v9
项目从vue2 升级vue3,VueI18n需要做适当的调整.主要是Vue I18n v8.x 到Vue I18n v9 or later 的变化,其中初始化: 具体可以参看:https://vue- ...
- vue2升级vue3:vue-i18n国际化异步按需加载
vue2异步加载之前说过,vue3还是之前的方法,只是把 i18n.setLocaleMessage改为i18n.global.setLocaleMessage 但是本文还是详细说一遍: 为什么需要异 ...
- vue3.0 vue.config.js 配置实战
今天讲述一下vue-config.js配置,我们前面搭建好脚手架会发现,这个对比2.x版本少了很多东西,没有build的配置,也没有webpack的配置,那么问题来了,我们如何去开发我们的项目呢,比如 ...
- uniapp项目vue2升级vue3简单记录
看到好多开源项目都升级了vue3,看文章说vue3性能升级很多,而且组合式api很香,遂把最近开发的自助洗车app升级下,在此记录下出现的问题. uniapp升级vue3官方指南 我是先去vue官网看 ...
- 解决webpack vue 项目打包生成的文件,资源文件均404问题
最近在使用webpack + vue做个人娱乐项目时,发现npm run build后,css js img静态资源文件均找不到路径,报404错误...网上查找了一堆解决办法,总结如下 一.首先修改c ...
- vue2升级vue3指南(一)—— 环境准备和构建篇
1.nodejs和npm 注意二者的版本,版本过低需要升级,本人升级后的版本如下: $ node -v v16.15.1 $ npm -v 8.11.0 2.package.json 和依赖升级 由于 ...
- webpack多页面打包配置
单页面应用:整个应用里面只有一个html文件.现在主流的框架,vue,react都是单页面应用. 所以webpack绝大部分都是对单页面打包.那么webpack如何对多页面进行打包 index.htm ...
- vite vue插件打包配置
import { defineConfig, UserConfigExport, ConfigEnv } from "vite"; import externalGlobals f ...
随机推荐
- shell脚本之规范与变量
shell编程规范与变量 名词简述 面向过程语言 按照顺序执行程序 第一件事干什么->第二件事干什么......(C,shell...) 面向对象语言 把程序看成一个整体(java,python ...
- Kafka基本原理、生产问题总结及性能优化实践
Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量 ...
- Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步优化(1920*1080测试图11ms处理完成)。
搜索到某个效果很好的视频去燥的算法,感觉效果比较牛逼,就是速度比较慢,如果能做到实时,那还是很有实用价值的.于是盲目的选择了这个课题,遇到的第一个函数就是角点检测,大概六七年用过C#实现过Harris ...
- mysql 索引图
- Util应用框架基础(一) - 依赖注入
本节介绍Util应用框架依赖注入的使用和配置扩展. 文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可. 概述 当你想调用某个服务的方法完成特定功能时,首先需要得到这个服务的实例. 最 ...
- Spring3.0中的AOP配置方法
http://zywang.iteye.com/blog/974226 http://www.cnblogs.com/garinzhang/p/java_spring_aop_aspect.html ...
- L2-030 冰岛人
需要注意的地方: 我们只记录维京人的祖先,除了维京人的其他人不能记录它的祖先 #include <bits/stdc++.h> using namespace std; struct pe ...
- springboot实现反向代理,动态代理目标地址
网上找了很多文章,各种照搬,只能自己实现 基于开源项目HTTP-Proxy-Servlet实现 开源项目地址:https://github.com/mitre/HTTP-Proxy-Servlet 1 ...
- 聊一聊Rust的enum
enum在实际编程中是非常常用的,enum的目的就是为了清晰定义出散落在系统各个角落的相同概念的有限固定值. 一.enum介绍如果是简单定义固定值,我们可以使用常量const.比如 public co ...
- springMvc_快速入门
概念:是一种基于Java实现mvc模型的轻量级web框架 优点:使用简单,开发便捷 灵活性强 总体来说springMvc就是来替代servlet的一种工具 快速入门: 1.创建maven-web ...