1.require 无法加载图片, 图片、文字等静态资源使用别名@ 、~@获取无法获取
require是node.js提供的模块 Webpack使用了node 使得编辑vue时可以使用require 但是vite不支持 而且图片在标签src中的路径不可以使用@ 别名获取绝对路径 css style中也不可以使用别名 ~@ 获取图片 文字等静态资源 替代方式 vite 静态资源处理
const imgUrl = new URL('@/assets/image/demo.png', import.meta.url).href
function getImageUrl(name) {
return new URL(`./dir/${name}.png`, import.meta.url).href
}
可以封装一个函数进行调用 根据不同的静态路径设置不同的函数 pub-use.ts
const getAssetsFile = (url: string) => {
if (url && url[0] == "/") {
url = url.slice(1);
}
return new URL(`../assets/img/${url}`, import.meta.url).href;
};
const usePub = () => {
return {
getAssetsFile,
};
};
export default usePub;
使用 pub-use.ts
import usePub from "@/utils/pub-use";
const Pub = usePub();
const getAssetsFile = Pub.getAssetsFile;
setup(){
return getAssetsFile
}
<img :src="getAssetsFile('/sh@2x.png')" />
2. 组件不传参时 props不可以设置为空 否则打包错误
错误示例 vite打包报错 Type ‘{}’ is not assignable to type ‘IntrinsicAttributes & (Partial<{ [x: number]: string; } | {}> & Omit<(readonly string[] | Readonly<ExtractPropTypes<Readonly<ComponentObjectPropsOptions>>>) & (VNodeProps & … 2 more … & Readonly<…>), never>)’. 原因是 子组件props:{} 更改 父组件不需要给子组件传值是 不写 props属性 解决
3.vue html事件绑定 函数 需要定义参数类型
如果需要用到箭头函数 需要指定event 参数类型
<el-input
@focus="
(e:any) => {
handle(e,item.name)
}
"
@blur="
(e:any) => {
handle(e,item.value)
}
"
class="input h-full w-full input_border_0"
v-model="fromData.packLength"
></el-input>
4. ts接口(interface ) 定义导出是需要使用 type 导出
interface navDrawerListType {
active?: boolean;
name_id?: string;
title: string;
iconUrl?: string;
path?: string;
query?: {
[propName: string]: string;
};
type?: number;
children?: navDrawerListType[];
}
export type { navDrawerListType};
5. tsconfig.json 、vite.config.js/vue.config.js 及环境变量 .env.development及 .env.production的变化
-
alias 路径 以及 开发环境切换的变化 -
css样式引入 变化 webpack // 添加全局样式 additionalData: @import "~@/assets/css/var.scss"; vite // 添加全局样式 additionalData: @import "src/assets/css/var.scss"; , -
webpack 判断开发环境可以直接使用process.env 获取到设置的 .env.development 及 .env.production不同开发环境的文件内容 vite 本来可以通过 import.meta.env 对象上暴露环境变量 但是 生产模式下重新编译了代码字符串改变了,导致获取不到。所以需要使用 define 暴露环境变量 参考 vite 环境变量和模式 vite 在vite.config.js外部不能直接获取到 .env.development 及 .env.production的内容 需要使用vite的 define 在 vite.config.js定义全局常量替换方式 建立 process.env 变量 且 .env.development 及 .env.production定义的变量需要使用VITE开头 vite.config.js才能获取的到 参考vite define 及vite env
vite tsconfig.json
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"],
"components/*": ["src/components/*"]
}
webpack tsconfig.json
"baseUrl": ".",
"paths": {
"@/*": ["src/*"],
"components/*": ["src/components/*"]
},
vite vite.config.js
import { defineConfig, loadEnv } from "vite";
import vue from "@vitejs/plugin-vue";
const path = require("path");
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import { replaceRequireVariable } from "./dynamic.js";
console.log("import.meta", import.meta);
export default ({ mode }) => {
const encConfig =loadEnv(mode, process.cwd());
return defineConfig({
envDir: "./",
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
define: {
"process.env": {
VITE_NODE_ENV:encConfig.VITE_NODE_ENV,
NODE_ENV:encConfig.VITE_NODE_ENV,
VITE_APP_BASE_API: encConfig.VITE_APP_BASE_API,
},
},
plugins: [
vue(),
replaceRequireVariable(["hyFileStyle.vue?vue&type=template&lang.js"]),
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver()],
}),
],
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "src/assets/css/var.scss";`,
},
},
},
server: {
proxy: {
"/api": {
target: encConfig.VITE_APP_BASE_API,
ws: true,
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ""),
},
},
},
});
};
webpack vue.config.js
const path = require('path')
const AutoImport = require('unplugin-auto-import/webpack')
const Components = require('unplugin-vue-components/webpack')
const { ElementPlusResolver } = require('unplugin-vue-components/resolvers')
process.env.VUE_APP_BASE_API = 'http://xxxxxx'
module.exports = {
devServer: {
proxy: {
'^/api': {
target: process.env.VUE_APP_BASE_API,
pathRewrite: {
'^/api': ''
},
changeOrigin: true
}
}
},
css: {
loaderOptions: {
scss: {
additionalData: `@import "~@/assets/css/var.scss";`
}
}
},
chainWebpack: (config) => {
config.resolve.alias
.set('@', path.resolve(__dirname, 'src'))
.set('components', '@/components')
config.plugin('AutoImport').use(
AutoImport({
imports: ['vue'],
resolvers: [
ElementPlusResolver({
importStyle: 'css',
exclude: new RegExp(/^(?!.*loading-directive).*$/)
})
],
dts: 'auto-imports.d.ts'
})
)
config.plugin('Components').use(
Components({
resolvers: [ElementPlusResolver({ importStyle: 'css' })],
dts: 'components.d.ts'
})
)
if (process.env.use_analyzer) {
config
.plugin('webpack-bundle-analyzer')
.use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
}
}
}
vite .env.development及 .env.production
.env.development
# .env.development 测试环境参数值
VITE_NODE_ENV= development
VITE_APP_BASE_API = "http://xxxxxx"
.env.production
# env.production 生产环境参数值
VITE_NODE_ENV= production
VITE_APP_BASE_API = "http://xxx"
webpack .env.development及 .env.production
.env.development
VUE_APP_BASE_URL=https://xxxxxxx
VUE_APP_BASE_NAME=hhh2
.env.production
VUE_APP_BASE_URL=https:xxxx
VUE_APP_BASE_NAME=hhh
|