IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> vue2+vite+vue-cli5 实现vite开发webpack打包 -> 正文阅读

[JavaScript知识库]vue2+vite+vue-cli5 实现vite开发webpack打包

20221008补充一条,如果需要兼容IE,需要修改.browserslistrc为

> 1%
last 2 versions
IE 11
IE 10

去除自带的not dead,

1. 为何要用vite开发,但是webpack打包

主要是因为即想要得到vite的高效开发模式(免编译)但是最后又想要兼容到IE9(ps,vite自带插件最多IE11而且打包出两份代码)

2. 实现流程

主要通过利用vue-cli5构建vue2项目(vue3不兼容IE),然后用vite-plugin-vue2实现vite开发(不需要使用它打包)

2.1 vue-cli5

推荐升级使用vue-cli5,可以避免很多问题,
例如vue-cli5默认会出现vue.config.js,
vue-cli4.3 生成的typescript 的vue项目中typescript版本过低导致报错
vue-cli4.3 很多vue.config.js的配置无效,例如 runtimeCompiler:true

npm install -g @vue-cli

2.2 创建vue项目

Use class-style component syntax 这儿先选择n,如果你希望项目依然可以兼容原来的非class写法的话,这个先选n,后面手动在package.json的dependencies加上

    "vue-class-component": "^7.2.3",
    "vue-property-decorator": "^9.1.2",

最后记得选择In dedicated config files 为Y,
typescript可选可不选

2.3 兼容vite

这部分我参考了这篇文章,但是对其中部分操作进行了修正webpack项目中使用vite加速的兼容模式详解

2.3.1 index.html处理

vite需要index.html在根目录,那就把index.html拷贝到根目录,这儿需要删除里面原有的htmlWebpackPlugin相关的代码,否则vite会报错,
另外还需要注入main函数给index.html

接下来在根目录下添加command文件夹,并在其中新建htm.js和vite.js(node启动用)
html.js 主要作用是在webpack打包前把index.html拷贝一份到public目录下

// ./command/html.js
const path = require('path')
const fs = require('fs')
// 把 index.html 拷贝到 public 下
fs.copyFileSync(path.resolve('./index.html'), path.resolve('./public/index.html'))

为何不保留public下的index.html呢,这就是一个坑,本人已经踩过了,
当public下存在index.html时,vite启动后无法正常给index.html注入main函数
因此需要vite.js

const path = require('path')
const fs = require('fs')
// vite启动时,需要删除public 下的index.html
if(fs.existsSync(path.resolve('./public/index.html'))){
    fs.unlinkSync(path.resolve('./public/index.html'));
}

然后就是新建vite.config.js
在里面配置vite-plugin-html实现main函数注入,具体可以参考之前提到的那篇文章

然后就是设置vite-plugin-vue2等插件到vite.config.js

2.3.2 启动项目配置

package.json中script部分

    "vite": "node ./command/vite.js && vite",
    "serve": "node ./command/html.js && npm run transformJs && vue-cli-service serve",
    "build": "node ./command/html.js && npm run transformJs && vue-cli-service build",
    "transformJs": "babel --plugins @babel/plugin-transform-modules-commonjs --presets=@vue/cli-plugin-babel/preset ./config -d ./config_cm"

我这提示需要babel7.0以上,卸了原来的6.x,重装7.0

npm uninstall babel-cli
npm uninstall babel-core
npm install @babel-cli
npm uninstall @babel-core

然后安装 @babel/plugin-transform-modules-commonjs 和 @vue/cli-plugin-babel 即可
npm run vite 表示vite启动

2.3.3 vite和webpack公用一个调试devServer

本来其实可以不用的,但是有些情况下,需要即时的看下webpack下的IE兼容情况,而不是每次都需要打包部署后查看
文章中提供了实现,就是上一节中的babel的作用,但是实际测试发现vue-cli5会检测devServer配置字段,
在根目录下新建config文件夹,然后新建config/index.js

export default function (webpackFlag) {
    let config = {
        host: '0.0.0.0',
        port: 12003,
        https: false,
        proxy: {
            "/_api": {
                //target: "http://172.27.148.96:8871",
                //target: "http://32.142.240.253:8871",  //写地址
                target: "http://localhost:8090",
                ws: true,  // 允许跨域
                changeOrigin: true,  //允许跨域
                pathRewrite: {
                    "^/_api": ""
                },
                timeout: 60000
            }
        }
    }
    if (webpackFlag === true) {
        return config;
    }
    else {
        config = Object.assign(config, {
            hotOnly: true,
            disableHostCheck: true
        })
        return config;
    }
}

相比原文章直接导出固定的config会导致vue-cli5启动时检测到不合法的字段而失败,我这儿导出了函数,并支持传入flag得到不同的config。
相应的vue.config.js中devServer要这么写

const path = require('path')
function resolve(dir) {
    return path.join(__dirname, dir)
}
const { defineConfig } = require('@vue/cli-service')
const getDevServer = require(resolve('config_cm')).default
module.exports = defineConfig({
  transpileDependencies: true,
  devServer:getDevServer(true)
})

vite.config.js中这么写

import getDevServer from './config/index.js'
...
{
server:getDevServer(),
}
...

3. 主要配置代码(用了ts)

vue.config.js 其他配置自己加

const path = require('path')
function resolve(dir) {
    return path.join(__dirname, dir)
}
const { defineConfig } = require('@vue/cli-service')
const getDevServer = require(resolve('config_cm')).default
module.exports = defineConfig({
  transpileDependencies: true,
  devServer:getDevServer(true)
})

vite.config.js 参考webpack项目中使用vite加速的兼容模式详解 并修改所得

// vite.config.js
import getDevServer from './config/index.js'
import { defineConfig, loadEnv } from 'vite'
import { createHtmlPlugin } from 'vite-plugin-html'
import path from 'path'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import { createVuePlugin } from "vite-plugin-vue2";
// import requireTransform from 'vite-plugin-require-transform';

export default defineConfig(({ mode }) => {
    const envPrefix = ['VUE']
    const env = loadEnv(mode, process.cwd(), envPrefix)
    const define = {
        'process.env.NODE_ENV': '"development"',
        'process.env.BASE_URL': '"/"',
        'process.env.VITE': true
    }
    for (const [key, value] of Object.entries(env)) {
        define[`process.env.${key}`] = `"${value}"`
    }
    // 加载环境变量,因为 vite 中不会加载以 VUE 开头的,我们得自己指定下
    return {
        build: {
            // 设置vite打包大小控制
            chunkSizeWarningLimit: 10000,
        },
        resolve: {
            extensions: [".vue", ".mjs", ".js", ".ts", ".jsx", ".tsx", ".json"],
            alias:{
                '@': path.resolve(__dirname, './src/')
            },
            // alias: [
            //     // 针对以 ~@/[包名称]开头的,替换为 node_modules/@[包名称]
            //     { find: /^(~@)(?!\/)(.+)/, replacement: path.join('node_modules/@$2') },
            //     // 针对以 ~@/ 开头,替换为 src/
            //     { find: /^~@\//, replacement: path.join(__dirname, 'src/') },
            //     // 针对以 @/ 开头的,替换为 src/
            //     { find: /^@\//, replacement: path.join(__dirname, './src', '/') }
            // ],
        },
        server:getDevServer(),
        define,
        plugins: [
            // requireTransform({
            //     fileRegex: /.js$|.vue$|.ts$/
            // }),
            createSvgIconsPlugin({
                // 指定要缓存的文件夹
                iconDirs: [path.resolve(process.cwd(), 'src/assets/svgs')],
                // 指定symbolId格式
                symbolId: '[name]'
            }),
            createVuePlugin(),
            createHtmlPlugin({
                minify: true,
                template: './index.html',
                entry: '/src/main.ts', // 这个会帮我们注入入口 js 文件
                inject: {
                    data: {
                        // 这是我们 index.html 用到的环境变量
                        ...env
                    }
                }
            })
        ]
    }
})

package.json部分
需要class组件写法的加上
“vue-class-component”: “^7.2.3”,
“vue-property-decorator”: “^9.1.2”,
可以实现class组件写法和原来的非class写法在typescript下兼容

{
  "scripts": {
    "vite": "node ./command/vite.js && vite",
    "serve": "node ./command/html.js && npm run transformJs && vue-cli-service serve",
    "build": "node ./command/html.js && npm run transformJs && vue-cli-service build",
    "transformJs": "babel --plugins @babel/plugin-transform-modules-commonjs --presets=@vue/cli-plugin-babel/preset ./config -d ./config_cm"
  },
  "dependencies": {
    "@babel/plugin-transform-modules-commonjs": "^7.18.6",
    "core-js": "^3.8.3",
    "vite": "^3.1.3",
    "vite-plugin-html": "^3.2.0",
    "vite-plugin-svg-icons": "^2.0.1",
    "vite-plugin-vue2": "^2.0.2",
    "vue": "^2.6.14",
    "vue-class-component": "^7.2.3",
    "vue-property-decorator": "^9.1.2",
    "vue-router": "^3.5.1"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^5.0.8",
    "@vue/cli-plugin-router": "~5.0.0",
    "@vue/cli-plugin-typescript": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "less": "^4.0.0",
    "less-loader": "^8.0.0",
    "typescript": "~4.5.5",
    "vue-template-compiler": "^2.6.14"
  }
}

顺便把tsconfig.json也提供下吧

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "noImplicitAny":false,
	  "skipLibCheck": true,
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "types": [
      "webpack-env"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:32:10  更:2022-10-08 20:34:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 16:59:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码