Config

coderljw 2024-10-13 Vue
  • Vue
  • Config
大约 2 分钟

# 1. index.html

<!DOCTYPE html>
<html lang="zh-cmn-Hans">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
    <link rel="icon" href="<%= BASE_URL %>logo.png" />
    <title>Ant Design Pro</title>
    <style></style>
    <!-- 引入CSS的CDN资源 -->
    <% for (var i in htmlWebpackPlugin.options.cdn &&
    htmlWebpackPlugin.options.cdn.css) { %>
    <link rel="stylesheet" href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" />
    <% } %>
  </head>
  <body>
    <noscript>
      <strong
        >非常抱歉!您的浏览器暂不支持JavaScript,请升级您的浏览器!</strong
      >
    </noscript>
    <div id="app"></div>
    <!-- 引入JS的CDN资源 -->
    <% for (var i in htmlWebpackPlugin.options.cdn &&
    htmlWebpackPlugin.options.cdn.js) { %>
    <script
      type="text/javascript"
      src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"
    ></script>
    <% } %>
  </body>
</html>
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
30
31
32

# 2. vue.config.js

const path = require('path')
const webpack = require('webpack')
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
  .BundleAnalyzerPlugin
const CompressionPlugin = require('compression-webpack-plugin')

// 设置别名
const resolve = dir => path.join(__dirname, dir)

const isProd = process.env.NODE_ENV === 'production'

// CDN资源
const assetsCDN = {
  externals: {
    vue: 'Vue',
    'vue-router': 'VueRouter',
    vuex: 'Vuex',
    axios: 'axios',
  },
  css: [],
  js: [
    '//cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.min.js',
    '//cdn.jsdelivr.net/npm/vue-router@3.1.3/dist/vue-router.min.js',
    '//cdn.jsdelivr.net/npm/vuex@3.1.1/dist/vuex.min.js',
    '//cdn.jsdelivr.net/npm/axios@0.19.0/dist/axios.min.js',
  ],
}

// 生产模式插件
let plugins = [
  // 忽略moment.js的所有语言环境文件(减小打包体积)
  new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
  // 打包文件可视化分析
  new BundleAnalyzerPlugin(),
  // GZip压缩
  new CompressionPlugin({
    test: /\.(js|css)(\?.*)?$/i, // 需要压缩的文件类型
    threshold: 10240, // 文件大于10k时启用压缩
    deleteOriginalAssets: false, // 压缩后保留原文件
  }),
]

// 添加生产模式插件
if (isProd) plugins = [...plugins]

const vueConfig = {
  // 发布路径修改
  publicPath: './',
  configureWebpack: {
    plugins,
    externals: isProd ? assetsCDN.externals : {},
  },

  chainWebpack: config => {
    config.resolve.alias.set('@$', resolve('src'))

    // 使用icon、svg图片
    const svgRule = config.module.rule('svg')
    svgRule.uses.clear()
    svgRule
      .oneOf('inline')
      .resourceQuery(/inline/)
      .use('vue-svg-icon-loader')
      .loader('vue-svg-icon-loader')
      .end()
      .end()
      .oneOf('external')
      .use('file-loader')
      .loader('file-loader')
      .options({
        name: 'assets/[name].[hash:8].[ext]',
      })

    if (isProd)
      config.plugin('html').tap(args => ((args[0].cdn = assetsCDN), args))
  },

  css: {
    loaderOptions: {
      // 设置less共享全局变量
      less: {
        globalVars: {
          primary: '#fff',
        },
      },
    },
  },

  // 开发模式
  devServer: {
    disableHostCheck: true, // 可防止热更新失效
    port: 7777, // 设置服务端口
    proxy: {
      // 要代理的请求路径
      '/agency': {
        target: 'http://www.coderljw.ga:4396', // 要跨域的域名(后端目标接口地址)
        changeOrigin: true, // 是否开启跨域
        ws: false, // 不开启websocket代理
        pathRewrite: {
          '^/agency': '', // 将/agency替换成''
        },
      },
    },
  },

  // 生产模式关闭SourceMap
  productionSourceMap: false,
  // 开发模式关闭保存eslint代码检测
  lintOnSave: false,
}

module.exports = vueConfig
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

# 3. babel.config.js

const productionPlugin = []
if (process.env.NODE_ENV === 'production')
  productionPlugin.push('transform-remove-console')

module.exports = {
  presets: ['@vue/cli-plugin-babel/preset'], // 进度条
  plugins: [
    [
      'component',
      {
        libraryName: 'element-ui', // element插件
        styleLibraryName: 'theme-chalk', // element样式插件
      },
    ],
    // 添加插件
    ...productionPlugin,
  ],
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 4. postcssrc.js

module.exports = {
  plugins: {
    // 将px转换为rem,内联样式不可转
    'postcss-pxtorem': {
      // 如果是vant组件,1rem = 37.5px,反之 1rem = 75px (设计稿的十分之一)
      rootValue({ file }) {
        return file.includes('vant') ? 37.5 : 75
      },
      // 转换所有属性
      propList: ['*'],
    },
  },
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 5. .prettierrc

{
  "printWidth": 120,
  "tabWidth": 2,
  "singleQuote": true,
  "semi": false,
  "arrowParens": "avoid",
  "jsxSingleQuote": true,
  "trailingComma": "none"
}
1
2
3
4
5
6
7
8
9
以父之名
周杰伦.mp3