基于webpack开发vue-cli

news2024/11/20 17:39:48

一、vue-cli开发

1. 项目整体目录

在这里插入图片描述

2. package.json

{
  "name": "vue-cli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "npm run dev",
    "dev": "cross-env NODE_ENV=development webpack serve --config ./config/webpack.config.js",
    "build": "cross-env NODE_ENV=production webpack --config ./config/webpack.config.js"
  },
  "keywords": [],
  "author": "cx",
  "license": "ISC",
  "browserslist": [
    "last 2 version",
    "> 1%",
    "not dead"
  ],
  "devDependencies": {
    "@babel/core": "^7.17.10",
    "@babel/eslint-parser": "^7.17.0",
    "@vue/cli-plugin-babel": "^5.0.4",
    "babel-loader": "^8.2.5",
    "copy-webpack-plugin": "^10.2.4",
    "cross-env": "^7.0.3",
    "css-loader": "^6.7.1",
    "css-minimizer-webpack-plugin": "^3.4.1",
    "eslint-plugin-vue": "^8.7.1",
    "eslint-webpack-plugin": "^3.1.1",
    "html-webpack-plugin": "^5.5.0",
    "image-minimizer-webpack-plugin": "^3.2.3",
    "imagemin": "^8.0.1",
    "imagemin-gifsicle": "^7.0.0",
    "imagemin-jpegtran": "^7.0.0",
    "imagemin-optipng": "^8.0.0",
    "imagemin-svgo": "^10.0.1",
    "less-loader": "^10.2.0",
    "mini-css-extract-plugin": "^2.6.0",
    "postcss-loader": "^6.2.1",
    "postcss-preset-env": "^7.5.0",
    "sass": "^1.51.0",
    "sass-loader": "^12.6.0",
    "stylus-loader": "^6.2.0",
    "unplugin-auto-import": "^0.7.1",
    "unplugin-vue-components": "^0.19.3",
    "vue-style-loader": "^4.1.3",
    "vue-template-compiler": "^2.6.14",
    "webpack": "^5.72.0",
    "webpack-cli": "^4.9.2",
    "webpack-dev-server": "^4.9.0"
  },
  "dependencies": {
    "element-plus": "^2.2.0",
    "vue": "^3.2.33",
    "vue-router": "^4.0.15"
  }
}

3. eslintrc.js

这里需要继承vue3的eslint校验规则

module.exports = {
  root: true,
  env: {
    node: true,
  },
  extends: ["plugin:vue/vue3-essential", "eslint:recommended"], // 继承
  parserOptions: {
    parser: "@babel/eslint-parser", // 解析器
  },
};

4. babel.config.js

这里直接使用@vue/cli-plugin-babel/preset预设,这里面已经为我们做好了各种兼容性处理和优化,不用我们在像以前一样还要自己配置core-js,@babel/plugin-transform-runtime等优化性的配置了。

module.exports = {
  presets: ["@vue/cli-plugin-babel/preset"], // 预设
};

5. webpack.config.js

const path = require("path");
const EslintWebpackPlugin = require("eslint-webpack-plugin"); // eslint检查代码
const HtmlWebpackPlugin = require("html-webpack-plugin"); // 生成html文件
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 提取css文件
const CssMinimizerWebpackPlugin = require("css-minimizer-webpack-plugin"); // 压缩css文件
const TerserWebpackPlugin = require("terser-webpack-plugin"); // 压缩js文件
const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin"); // 压缩图片
const CopyPlugin = require("copy-webpack-plugin"); // 拷贝文件
const { VueLoaderPlugin } = require("vue-loader"); // vue-loader插件
const { DefinePlugin } = require("webpack"); // 定义环境变量
const AutoImport = require("unplugin-auto-import/webpack"); // 按需加载element-plus
const Components = require("unplugin-vue-components/webpack"); // 按需加载element-plus
const { ElementPlusResolver } = require("unplugin-vue-components/resolvers"); // 按需加载element-plus
 
const isProduction = process.env.NODE_ENV === "production"; // 判断是否是生产环境

// 返回处理样式loader函数
const getStyleLoaders = (pre) => {
  return [
    isProduction ? MiniCssExtractPlugin.loader : "vue-style-loader",
    "css-loader",
    {
      // 处理css兼容性问题
      // 配合package.json中browserslist来指定兼容性
      loader: "postcss-loader",
      options: {
        postcssOptions: {
          plugins: ["postcss-preset-env"],
        },
      },
    },
    pre && {
      loader: pre,
      options:
        pre === "sass-loader"
          ? {
              additionalData: `@use "@/styles/element/index.scss" as *;`, // 自定义element-plus主题
            }
          : {},
    },
  ].filter(Boolean);
};

module.exports = {
  entry: "./src/main.js", // 入口文件
  output: { // 输出文件
    path: isProduction ? path.resolve(__dirname, "../dist") : undefined, // 生产环境输出路径
    filename: isProduction ? "static/js/[name].[contenthash:10].js" : "static/js/[name].js", // 生产环境文件名 
    chunkFilename: isProduction ? "static/js/[name].[contenthash:10].chunk.js" : "static/js/[name].chunk.js",  // 生产环境代码分割文件名
    assetModuleFilename: "static/media/[hash:10][ext][query]", // 生产环境资源文件名
    clean: true, // 清除上一次打包文件
  },
  module: { // 处理模块规则
    rules: [
      // 处理css
      {
        test: /\.css$/,
        use: getStyleLoaders(),
      },
      {
        test: /\.less$/,
        use: getStyleLoaders("less-loader"),
      },
      {
        test: /\.s[ac]ss$/,
        use: getStyleLoaders("sass-loader"),
      },
      {
        test: /\.styl$/,
        use: getStyleLoaders("stylus-loader"),
      },
      // 处理图片
      {
        test: /\.(jpe?g|png|gif|webp|svg)$/,
        type: "asset",
        parser: {
          dataUrlCondition: {
            maxSize: 10 * 1024,
          },
        },
      },
      // 处理其他资源
      {
        test: /\.(woff2?|ttf)$/,
        type: "asset/resource",
      },
      // 处理js
      {
        test: /\.js$/,
        include: path.resolve(__dirname, "../src"),
        loader: "babel-loader",
        options: {
          cacheDirectory: true,
          cacheCompression: false,
        },
      },
      {
        test: /\.vue$/, // 处理vue
        loader: "vue-loader",
        options: {
          // 开启缓存
          cacheDirectory: path.resolve(__dirname, "../node_modules/.cache/vue-loader"),
        },
      },
    ],
  },
  // 处理html
  plugins: [
    new EslintWebpackPlugin({ // eslint检查代码
      context: path.resolve(__dirname, "../src"),  // 指定eslint检查的目录
      exclude: "node_modules", // 排除node_modules文件夹
      cache: true, // 开启缓存
      cacheLocation: path.resolve(__dirname, "../node_modules/.cache/.eslintcache"), // eslint缓存cache文件夹
    }),
    new HtmlWebpackPlugin({ // 生成html文件
      template: path.resolve(__dirname, "../public/index.html"), // 指定html模板
    }),
    isProduction &&
      new MiniCssExtractPlugin({ // 提取css文件
        filename: "static/css/[name].[contenthash:10].css", // 生产环境文件名
        chunkFilename: "static/css/[name].[contenthash:10].chunk.css", // 生产环境代码分割文件名
      }),
    isProduction &&
      new CopyPlugin({ // 拷贝文件
        patterns: [ // 拷贝文件列表
          {
            from: path.resolve(__dirname, "../public"), // 拷贝文件源
            to: path.resolve(__dirname, "../dist"), // 拷贝文件目标
            globOptions: { 
              // 忽略index.html文件
              ignore: ["**/index.html"],
            },
          },
        ],
      }),
    new VueLoaderPlugin(), // vue-loader插件
    // cross-env定义的环境变量给打包工具使用
    // DefinePlugin定义环境变量给源代码使用,从而解决vue3页面警告的问题
    new DefinePlugin({
      __VUE_OPTIONS_API__: true,
      __VUE_PROD_DEVTOOLS__: false,
    }),
    // 按需加载element-plus
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [
        ElementPlusResolver({
          // 自定义主题,引入sass
          importStyle: "sass",
        }),
      ],
    }),
  ].filter(Boolean),
  mode: isProduction ? "production" : "development",
  devtool: isProduction ? "source-map" : "cheap-module-source-map",  // 生产环境生成source-map
  optimization: { // 优化
    splitChunks: { // 代码分割
      chunks: "all", // 分割所有代码
      cacheGroups: { // 缓存组
        vue: { // 分割vue
          test: /[\\/]node_modules[\\/]vue(.*)?[\\/]/,
          name: "vue-chunk",
          priority: 40,
        },
        elementPlus: { // 分割element-plus
          test: /[\\/]node_modules[\\/]element-plus[\\/]/,
          name: "elementPlus-chunk",
          priority: 30,
        },
        libs: { // 分割第三方库
          test: /[\\/]node_modules[\\/]/,
          name: "libs-chunk",
          priority: 20,
        },
      },
    },
    runtimeChunk: {
      name: (entrypoint) => `runtime~${entrypoint.name}.js`, // 生成runtime文件
    },
    minimize: isProduction, // 生产环境压缩代码
    minimizer: [
      new CssMinimizerWebpackPlugin(), // 压缩css文件
      new TerserWebpackPlugin(), // 压缩js文件
      new ImageMinimizerPlugin({ // 压缩图片
        minimizer: { // 压缩器
          implementation: ImageMinimizerPlugin.imageminGenerate, // 使用imagemin
          options: {
            plugins: [
              ["gifsicle", { interlaced: true }],
              ["jpegtran", { progressive: true }],
              ["optipng", { optimizationLevel: 5 }],
              [
                "svgo",
                {
                  plugins: [
                    "preset-default",
                    "prefixIds",
                    {
                      name: "sortAttrs",
                      params: {
                        xmlnsOrder: "alphabetical",
                      },
                    },
                  ],
                },
              ],
            ],
          },
        },
      }),
    ],
  },
  // webpack解析模块加载选项
  resolve: {
    // 自动补全文件扩展名
    extensions: [".vue", ".js", ".json"],
    // 路径别名
    alias: {
      "@": path.resolve(__dirname, "../src"),
    },
  },
  devServer: {
    host: "localhost",
    port: 3000,
    open: true,
    hot: true, // 开启HMR
    historyApiFallback: true, // 解决前端路由刷新404问题
  },
  performance: false, // 关闭性能提示
};

二、解读webpack.config.js关于vue的配置部分

1. module 部分:

  • 处理 Vue 单文件组件的 loader:

{
  test: /\.vue$/, // 处理vue
  loader: "vue-loader",
  options: {
    // 开启缓存
    cacheDirectory: path.resolve(__dirname, "../node_modules/.cache/vue-loader")
  }
}

这里使用 vue-loader 处理 .vue 文件,开启缓存加快构建速度。

2. plugins 部分:

  • VueLoaderPlugin:

new VueLoaderPlugin()

在 webpack.config.js 文件中使用了 VueLoaderPlugin,这是用于 Vue-loader 的插件,它会在开发环境下编译 Vue 单文件组件。

  • DefinePlugin:

new DefinePlugin({
  __VUE_OPTIONS_API__: true,
  __VUE_PROD_DEVTOOLS__: false
})

Vue 3 项目会出现页面警告,可以使用 DefinePlugin 插件定义全局变量来解决,这里定义了 VUE_OPTIONS_APIVUE_PROD_DEVTOOLS

  • 按需加载element-plus
    // 按需加载element-plus
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),

3. optimization 部分:

这部分主要是配置优化选项,其中包括代码分割、压缩等配置。

  • 代码分割:
splitChunks: {
  chunks: "all",
  cacheGroups: {
    vue: {
      test: /[\\/]node_modules[\\/]vue(.*)?[\\/]/,
      name: "vue-chunk",
      priority: 40
    },
    elementPlus: {
      test: /[\\/]node_modules[\\/]element-plus[\\/]/,
      name: "elementPlus-chunk",
      priority: 30
    },
    libs: {
      test: /[\\/]node_modules[\\/]/,
      name: "libs-chunk",
      priority: 20
    }
  }
}

在 webpack.config.js 文件中使用了 SplitChunksPlugin 插件对代码进行了分割,其中包括了对 Vue、Element-UI 等第三方库的分割,可以提高页面加载速度。

  • 生产环境压缩:

minimize: isProduction,
minimizer: [
  new CssMinimizerWebpackPlugin(),
  new TerserWebpackPlugin(),
  new ImageMinimizerPlugin({
    minimizer: {
      implementation: ImageMinimizerPlugin.imageminGenerate,
      options: {
        plugins: [
          ["gifsicle", { interlaced: true }],
          ["jpegtran", { progressive: true }],
          ["optipng", { optimizationLevel: 5 }],
          [
            "svgo",
            {
              plugins: [
                "preset-default",
                "prefixIds",
                {
                  name: "sortAttrs",
                  params: {
                    xmlnsOrder: "alphabetical"
                  }
                }
              ]
            }
          ]
        ]
      }
    }
  })
]

在生产环境中使用了优化插件,包括压缩 CSS、JS 和图片等资源文件。

4. resolve部分

  // webpack解析模块加载选项
  resolve: {
    // 自动补全文件扩展名
    extensions: [".vue", ".js", ".json"],
    // 路径别名
    alias: {
      "@": path.resolve(__dirname, "../src"),
    },
  },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习常识 23: U-Net

摘要: U-Net 集编码-解码于一体, 是一种常见的网络架构. 图 1. U-Net 例. 如图 1 所示, U-Net 就是 U 形状的网络, 前半部分 (左边) 进行编码, 后半部分 (右边) 进行解码. 编码部分, 将一个图像经过特征提取, 变成一个向量. 前面说过: 深度学习本质上只做件事情, 就是特征提取…

【ESXi 7.x/8.x】ESXi 配置备份与还原

目录 1. 使用 ESXi命令行备份数据(1)将已更改的配置与持久存储同步(2)备份 ESXi 主机的配置数据(3)下载配置文件通过浏览器下载配置文件通过wget命令下载 (4)注意事项 2. 还原 ESXi …

基于Java班主任助理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

一直报错npm ERR! cb() never called!删除缓存仍然不行

看到npm下载包出错, 通常我们会手动删除node-modules这个文件夹来解决. 但是往往现实很骨感, 然后我们会找网上各种方法来解决, 比如这篇文章 但是当所有方法都尝试了一遍, 仍然还是出错, 这到底是什么原因呢? 可以使用npm config ls 查看一下我们电脑上是否会有一份.npmrc…

前端Vue自定义顶部搜索框 热门搜索 历史搜索 用于搜索跳转使用

前端Vue自定义顶部搜索框 热门搜索 历史搜索 用于搜索跳转使用&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13128 效果图如下&#xff1a; #### 自定义顶部搜索框 用于搜索跳转使用方法 使用方法 <!-- 自定义顶…

【MySQL新手入门系列四】:手把手教你MySQL数据查询由入门到学徒

SQL语言是与数据库交互的机制&#xff0c;是关系型数据库的标准语言。SQL语言可以用于创建、修改和查询关系数据库。SQL的SELECT语句是最重要的命令之一&#xff0c;用于从指定表中查询数据。在此博客中&#xff0c;我们将进一步了解SELECT语句以及WHERE子句以及它们的重要性。…

PCB设计实验|第一周|2月27日

目录 一、实验原理 二、实验环境 三、实验结果 四、实验总结 一、实验原理 Altium Designer 提供了唯一一款统一的应用方案&#xff0c;其综合电子产品一体化开发所需的所有必须技术和功能。Altium Designer 在单一设计环境中集成板级和FPGA系统设计、基于FPGA和分立处理器的…

Axure基础:中继器与热区

一、中继器 1、中继器的主要作用 中继器就是临时的数据库&#xff0c;在我们需要当前原型图存储和变更一些数据的时候会经常用到。 能用到中继器的一般都是高保真原型&#xff0c;如果不需要大量的数据动态展示&#xff0c;那么几乎用不到或者搞动态面板也可以实现。 下面我…

selenium之元素定位

一、selenium安装 pip3 install selenium 二、安装浏览器驱动 1&#xff1a;下载最新的浏览器驱动 chrome浏览器驱动下载地址&#xff1a; https://registry.npmmirror.com/binary.html?pathchromedriver/ 查看自己电脑上安装的chrome浏览器版本号&#xff0c;驱动和浏览…

【工程实践】python实现多进程

1 多线程与多进程 Python中比较常见的并发方式主要有两种&#xff1a;多线程和多进程。 1-1 多线程 多线程即在一个进程中启动多个线程执行任务。一般来说使用多线程可以达到并行的目的&#xff0c;但由于Python中使用了全局解释锁GIL的概念&#xff0c;导致Python中的多线程并…

Doo Prime 德璞资本:怎么买原油期货?原油期货买卖策略分享

随着中国经济市场的逐步开放&#xff0c;也为了快速和国际金融接轨&#xff0c;我国于2018年3月26日正式挂牌上市原油期货交易。并且我国的原油期货交易合约和美原油期货和布伦特原油期货交易是相互影响的&#xff0c;这让中国投资者可以足不出户的进行原油期货投资。那么在国内…

Jconsole 开启远程连接遇到的一些坑

最近在学习 JVM&#xff0c;其中涉及到性能、内存等指标分析需要使用工具分享&#xff0c;Java 提供了几个可视化工具来监控和管理 Java 应用&#xff0c;比如 Jconsole、JVisual、JMC&#xff0c;他们以图形化的界面实时的监控程序各种性能指标以及内存、CPU 的使用情况。 Jco…

Triton教程 --- 模型管理

Triton教程 — 模型管理 Triton系列教程: 快速开始利用Triton部署你自己的模型Triton架构模型仓库存储代理模型设置优化动态批处理速率限制器 Triton 提供的模型管理 API 是 HTTP/REST 和 GRPC 协议的一部分&#xff0c;也是 C API 的一部分。 Triton 以三种模型控制模式之一…

5.实用干货-你可能没留意的几个生信基础

Reads&#xff1a;高通量测序平台产生的序列。 Raw Reads&#xff1a;原始下机数据称为Raw Reads&#xff08;Raw data&#xff09;。 Clean Reads&#xff1a;通过生物信息的方法&#xff0c;去除一些质量差的reads&#xff08;比如测序错误&#xff0c;长度小于20的reads&a…

TypeScript零基础入门之背景介绍和环境安装

一、什么是TypeScript TypeScript是一种由微软开发和维护的开源编程语言。它是JavaScript的超集&#xff0c;意味着任何JavaScript程序都是一种有效的TypeScript程序。TypeScript添加了静态类型、类、接口、枚举和命名空间等概念&#xff0c;同时支持ES6特性。TypeScript被视为…

Flutter 初探原生混合开发

转载请注明出处&#xff1a;https://blog.csdn.net/kong_gu_you_lan/article/details/131320733?spm1001.2014.3001.5501 本文出自 容华谢后的博客 0.写在前面 现如今跨平台技术被越来越多的开发者提起和应用&#xff0c;从最早的Java到后来的RN、Weex&#xff0c;到现在的Co…

每日学术速递6.11

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Video-ChatGPT: Towards Detailed Video Understanding via Large Vision and Language Model 标题&#xff1a;Video-ChatGPT&#xff1a;通过大型视觉和语言模型实现详细的视频理…

SCI论文插图怎么做?有这一篇文章就够了

SCI插图的整体要求 SCI杂志种类很多&#xff0c;对插图的要求也各有不同&#xff0c;但是以下几条是通用的&#xff1a; 1. 插图尺寸要符合SCI期刊要求 2. 同篇文稿插图中文字须统一字号及字体 3. 须提交SCI期刊指定文件类型的插图 4. 插图文件命名须符合SCI期…

C++基础(15)——STL常用算法(遍历和查找)

前言 本文介绍了C中STL常用遍历和查找算法。 9.1&#xff1a;常用遍历算法&#xff08;for_each、transform&#xff09; 9.1.1&#xff1a;foreach for_each&#xff1a;遍历容器&#xff0c;transform&#xff1a;搬运一个容器中的数据到另一个容器中 for_each中使用普通…

自建iOS消息推送服务Bark

老苏的 DSM6.17 系统恢复之后&#xff0c;发现丢了一些套件&#xff0c;在安装 phpMyAdmin 套件时&#xff0c;显示需要用到 PHP7.4 但是在套件里搜索却只有 PHP7.3 从 https://archive.synology.cn/download/Package/PHP7.4 下载了最低的 7.4.9-0003 手动安装时居然显示 DSM6.…