VUE学习:三.VueCLI 配置

sadwind2024-02-29笔记72

前言

掌握一些项目中常见的 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

sphinx 搜索 服务器重启后操作步骤

/www/server/sphinx-3.4.1/bin/indexer -c /www/server/sphinx-3.4.1/etc/icms.conf --all /www/server/sph...

老了,才老是想回到从前吧

昨日收拾一些杂物,找到一些学生时的老照片,那时的自己是那么年轻啊,意气风发啊。还有一些学生时代的合影,看着照片,就想啊,大部份同学,这辈子估计都不会再见上一面了吧。还有一些老婆学生时的照片,那会真的青...

MYSQL 数据库记录删除后 ID不连续 如何恢复

在数据库维护过程中,不免会删除一些记录一般主键ID都是自增字段,不可编辑,删除就是删除了,这个字段值再也不会出现了。因此产生两个问题,一是有些项目数据库超大,增删又频繁,是可能ID数量不够用的。二就是...

使用FunAdmin二次开发 新建一个应用需要哪些东西

backend是FunAdmin默认的后台应用。1,先建一个数据表,如fun_dealer.2,根据表建一个模型,如:app/backend/model/Dealer.php3,根据表名,建一个控制器...

VUE学习:六.页面布局

VUE学习:六.页面布局

前言页面布局决定了一个页面的整体结构,一个好的布局能使整个页面一眼看上去结构清晰,层次分明,可以简单地将组件分为:容器组件与展示组件适配规则(pc,移动) 分辨率调整#1.职能划分Vue 组件按照职能...

layui 子页面用parent()拿到父页面的数据并回显数据

//父页面   定义一个全局变量来获取到表格当前行的数据 var objdata;  //工具条操作按钮事件   &nbs...

Post Reply    

◎Welcome to participate in the discussion.