VUE学习:三.VueCLI 配置

sadwind2024-02-29笔记73

前言

掌握一些项目中常见的 webpack 配置,能够从容应对一些开发场景问题

#1.vue-cli 2.x

#1.1 css 相关

  • style-loader ( 处理 style 内联样式 )

  • css-loader (处理.css 文件)

  • postcss-loader (处理 css 兼容)

  • less-loader (处理.less 文件)

  • sass-loader (处理.sass/.scss 文件)

let comment = [
  "style-loader",
  "css-loader",
  {
    loader: "postcss-loader",
    options: {
      postcssOptions: {
        plugins: ["postcss-preset-env"],
      },
    },
  },]module.exports = {
  module: {
    rules: [
      {
        test: /.css/,
        use: [...comment],
      },
      {
        test: /.less$/,
        use: [...comment, "less-loader"],
      },
    ],
  },}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

#1.2 js 相关

  • babel-loader

  • @babel/core

  • @babel/preset-env

  • @babel/polyfill

module.exports = {
 entry:['@babel/polyfill','./src/index.js']
 ...
 module:{
  rules:[
    {
    test:/.js$/,
    use:[
        {
          loader:'babel-loader',
          options:{
            presets:['@babel/preset-env']
            // 或者
            presets:[['env',{module:false}]]
          }
        }
      ]
    }
  ]
 }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#1.3 文件相关

  • url-loader

  • file-loader

  • html-loader

 module.exports = {
  ...
  module:{
    rules:[
      {
        test:/.(png|jpg|gif)$/,
        use:[
          {
          loader:file-loader,
          options:{
          limit:4 *1024,
          name:'img/[name]_[hash:10].[ext]'
          }
          }
        ]
      },
      {
        test:/.html$/,
        loader:'html-loader'
      }
    ]
  }
 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#1.4 vue 相关

  • vue-loader

  • vue-style-loader

 module.exports = {
  ...
  module:{
  rules:[
      {
        test:/.vue$/,
        loader:'vue-loader'
      },
      {
        test:/.css$/,
        use:[
          'vue-style-loader',
          'css-loader'
        ]
      }
    ]
  }
 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#2.vue-cli 3.x

#2.1 默认配置

  • vue-cli 3.x 为我们默认封装了项目运行常用的 webpack 配置

  • 除了使用vue inspect plugins我们还可以通过运行 vue ui进入可视化页面查看

const VueLoaderPlugin = require("vue-loader/lib/plugin") // vue-loader 是webpack的加载器,允许你以单文件组件的格式编写vue组件const { DefinePlugin } = require("webpack") // webpack 内置插件,用于创建编译时可以配置的全局常量const CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin") // 用于强制所有默认的完整路径必须与磁盘上实际路径的确切大小写相匹配const FriendlyErrorsPlugin = require("friendly-error-webpack-plugin") //识别某些类型的webpack错误并整理,以提供开发人员更好的体验。const MiniCssExtractPlugin = require("mini-css-extract-plugin") // 将css 提取到单独的文件中,为每个包含css的js文件创建一个css文件const { HashedModuleIdsPLugin } = require("webpack") // webpack内置插件,用于根据模块的相对路径生成hash作为模块id,一般用于生产环境const HtmlWebpackPlugin = require("html-webpack-plugin") //用于根据模块或使用加载器生成HTML文件const PreloadPlugin = require("preload-webpack-plugin") // 用于在使用html-webpack-plugin生成的html中添加<link rel="preload" >或<link rel="prefetch">,有助于异步加载const CopyWebpackPlugin = require("copy-webpack-plugin") //用于将单个文件或整个目录复制到构建目录module.exports = {
  plugins: [
    new VueLoaderPlugin(),
    new DefinePlugin(),
    new FriendlyErrorsWebpackPlugin(),
    new MiniCssExtractPlugin(),
    new OptimizeCssnanoPlugin(),
    new OptimizeCssnanoPlugin(),
    new HtmlWebpackPlugin(),
    new PreloadPlugin(),
    new CopyWebpackPlugin(),
  ],}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#2.2 vue.config.js

注意

新创建的 vue 项目没有这个文件,需要自己在根目录创建 vue.config.js

├── vue.config.js
│   ├── 其他配置
│   ├── chainWebpack
│   ├── configureWebpack
│   ├── devServer
│   ├── css
│   ├── pages
1
2
3
4
5
6
7

#2.2.1.其他配置

  • 1.配置二级目录:默认打开页面http://localhost:8080 改为 http://localhost:8080/project

    publicPath: 'project',
    1
  • 2.配置打包目录:默认dist 改为 mydist

    outputDir: 'mydist',
    1
  • 3.配置 source-map:线上环境代码方便调试

    productionSourceMap:true,
    1

#2.2.2.chainWebapck

更细粒度的控制 webpack 的内部配置,其集成的是webpack-chain这一插件,该插件可以让我们能够使用链式操作来修改配置

  • 1.url-loader:处理图片

    const merge = require('webpack-merge')module.exports = {
      ...
      chainWebpack: config => {// config 参数为已经解析好的 webpack配置
        config.module      .rule('image')
          .use('url-loader')
          .tap(options =>
            merge(options,{ // 这里需要注意的是我们使用了 webpack-merge 这一插件,该插件用于做 webpack 配置的合并处理,这样 options 下面的其他值就不会被覆盖或改变
              limit: 5120
            })
          )
      }
      ...}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    以上操作我们可以成功修改 webpack 中 module 项里配置 rules 规则为图片下的 url-loader 值,将其 limit 限制改为 5M

    module: {
      rules: [
        {
          test: /\.(png|jpe?g|gif|webp)(\?.*)?$/,
          use: [
            {
              loader: "url-loader",
              options: {
                limit: 5120,
                name: "img/[name].[hash:8].[ext]",
              },
            },
          ],
        },
      ]}
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
  • 2.简化路径

  module.exports = {
    ...
    chainWebpack: config => {// config 参数为已经解析好的 webpack配置
      config.resolve.alias      .set('@', resolve('src'))
      .set('static', resolve('static'))
    }
    ...
  }
1
2
3
4
5
6
7
8
9

#2.2.3.configureWebpack

除了使用 chainWebpack 配置外,我们还可以使用 configureWebpack 来修改,两者的不同点在于 chianWebpack 是链式修改,而 configureWebapck 更倾向于整体替换和修改

  • configWbpack 可以直接是一个对象,也可以是一个函数,如果是对象他会直接使用 webpack-merge 对其进行合并处理

  • configWbpack 如果是函数,你可以直接使用其 config 参数来修改 webpack 中的配置,或者返回一个对象进行 merge 处理

module.exports = {
  // config 参数为已经解析好的webpack配置
  configureWebpack: (config) => {
    // config.plugins = [];//这样会直接将plugins置空
    return {
      plugins: [], // 使用return 一个对象会通过 webpack-merge进行合并,plugins不会置空
    }
  },}
1
2
3
4
5
6
7
8
9
  • 项目目录下运行 vue inspect来查看你修改后的 webpackp 完整配置

vue inspect plugins # 缩小审查范围,只查看 plugins的内容
1

#2.2.4.devServer

devServer 可以对本地服务器配置,我们在命令中运行的yarn serve对应的命令vue-cli-service server其实便是基于 webpack-dev-server 开启的一个本地服务器

module.exports = {
  devServer: {
    compress: true, //开发服务器是否启动gzip等压缩
    host: "localhost", //开发服务器监听的主机地址
    hot: true,
    hotOnly: true, // 热更新
    https: false, // https:{type:Boolean}
    open: true,
    overlay: {
      errors: true, // 让浏览器 overlay 同时显示警告和错误
      warnings: false,
    },
    port: 8090, //开发服务器监听的端口
    proxy: {
      //配置不同的后台API地址
      "/api": {
        target: "http://localhost:8090",
        ws: false, //是否开启websocket
        changeOrigin: true, //允许跨域
        pathRewrite: {
          "^/api": "/mock",
        },
      },
    },
    before(app) {
      // mock数据
    },
  },}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

当然除了以上参数,其支持所有的 webpack-dev-server 中的选项,比如hostoryApiFallback用于重写路由、progress 将运行进度输出到控制台等

#2.2.5.css

  • 1.响应式页面

module.exports = {
  css: {
    loaderOptions: {
      postcss: {
        plugins: [
          require("postcss-pxtorem")({
            rootValue: 192,
            // unitPrecision: 5,
            propList: ["*"],
            // selectorBlackList: [],
            // replace: true,
            mediaQuery: false,
            minPixelValue: 3,
            exclude: /node_modules/i,
          }),
        ],
      },
    },
  },}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • 2.全局样式 全局sass样式文件进行全局引入






     
     
     
     
     
     
     
     
     
     
     
     




    // vue.config.js...css: {
      sourceMap: false,
      loaderOptions: {
        scss: {
          additionalData: `
              @import "~@/assets/styles/norm.scss";
              @import "~@/assets/styles/mixins.scss";        `
        },
        sass: {
          additionalData: `
              @import "~@/assets/styles/norm.scss"
              @import "~@/assets/styles/mixins.scss"        `
        }
      }}...
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

总结

了解 vue 项目中的 vuecli 的作用,以及相关的配置方式,能在项目中遇到相关问题时轻松应对


relate content

VUE学习:五.UI 框架

前言如果你想快速开发一款应用,并且不想过多的操心页面 UI 的内容,比如你不想去实现一个下拉 UI 组件或设计一个 icon 图标,那么我们可以使用现有的别人做...

新的启程:得想点办法 好点子

因为个人原因,想做个网站,利用空余时间,网上收集整理一些资源,放些广告赚点小钱,目前看来很难实现了。申请了好多次广告联盟,都被拒绝了,大概理由就是网站流量不够,内容不多,原创内容少,仔细一想,这还是很...

VUE学习:八.多页应用

前言MPA 多页面应用(MultiPage Application) ,指有多个独立页面的应用(多个 html 页面),每个页面必须重复加载 js、css 等相关资源。多页应用跳转,需要整页资源刷新。...

如何记数据库中数据重新恢复ID连续

这是一个不是问题的问题,只是针对一些强迫症才有这种想法。大家都知道数据库中的记录主键ID是自增连续的,如果删除了某一行数据,再添加新数据,那条被删除的ID也不会再出现了,对于一些强迫症来说,看着ID不...

VUE学习:一.开发工具

VUE学习:一.开发工具

前言了解前端项目开发中环境的相关配置,工具的相关使用技巧等,有助于快速解决开发时遇到的各种问题,提高开发效率#1.Node.js注意实际开发中团队中 node 版本最好保持一致,包括各种环境(dev、...

扩展 layui 的导出插件 layui.excel

就像下面说的一样,遇到问题。https://gitee.com/zypy333/layui-excel之前在工作过程中还有社区交流过程中,发现对导出 Excel 文件有需求,所以就萌发了封装插件的想法...

Post Reply    

◎Welcome to participate in the discussion.