vue-cli 3.0的踩坑之旅

  1. 一份完整的vue.config.js配置(包含多页面配置)
const path = require('path');

module.exports = {
  // 基本路径
  baseUrl: './',
  assetsDir: 'static',
  // 输出文件目录
  outputDir: 'dist',
  // eslint-loader 是否在保存的时候检查
  //如果你想要在生产构建时禁用 eslint-loader,你可以用如下配置
  lintOnSave: process.env.NODE_ENV !== 'production',
  // webpack的配置
  configureWebpack: {
    devtool: 'inline-source-map',
    performance: {
      hints: false,
      maxEntrypointSize: 512000,
      maxAssetSize: 512000
    },
    resolve: {
      extensions: ['.js', '.vue', '.json'],
      alias: {
        '@assets': '@/assets',
        '@components': '@/components',
        '@common': '@/components/common',
        '@views': '@/views',
        '@utils': '@/utils',
      }
    },
  },

  // 生产环境是否生成 sourceMap 文件
  productionSourceMap: false,
  // css相关配置
  css: {
    // 是否使用css分离插件 ExtractTextPlugin
    extract: process.env.NODE_ENV === 'production',
    // 开启 CSS source maps?
    sourceMap: false,
    // css预设器配置项
    loaderOptions: {},
    // 启用 CSS modules for all css / pre-processor files.
    modules: false
  },
  // use thread-loader for babel & TS in production build
  // 该选项在系统的 CPU 有多于一个内核时自动启用
  parallel: require('os').cpus().length > 1,
  // PWA 插件相关配置
  // see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
  pwa: {},
  // webpack-dev-server 相关配置
  devServer: {
    open: process.platform === 'darwin',
    host: 'localhost',
    port: 8081,
    https: false, // 是否启用https
    hot: true, // 启用webpack的热模块替换功能:
    hotOnly: false, // devServer.hot在没有页面刷新的情况下启用热模块替换(请参阅)作为构建失败时的后备。
    inline: true, // 在开发服务器的两种不同模式之间切换,默认为true
    compress: true, // 是否开启压缩
    proxy: null, // 设置代理
  },
  // 第三方插件配置
  pluginOptions: {
    'style-resources-loader': {
      preProcessor: 'scss',
      patterns: [
        path.resolve(__dirname, 'src/assets/css/reset.css'),
      ]
    }
  },
  <!--  配置多页面  -->
  pages: {
    index: {
      // page 的入口
      entry: 'src/pages/index/main.js',
      // 模板来源
      template: 'public/index.html',
      // 在 dist/index.html 的输出
      filename: 'index.html',
      // 在这个页面中包含的块,默认情况下会包含
      // 提取出来的通用 chunk 和 vendor chunk。
      chunks: ['chunk-vendors', 'chunk-common', 'index']
    },
    share: {
      // page 的入口
      entry: 'src/pages/share/share.js',
      // 模板来源
      template: 'public/share.html',
      // 在 dist/index.html 的输出
      filename: 'share.html',
      // 在这个页面中包含的块,默认情况下会包含
      // 提取出来的通用 chunk 和 vendor chunk。
      chunks: ['chunk-vendors', 'chunk-common', 'share']
    },
  }
}
复制代码
  1. 动态加载meta标签的值

只需要在router.js时配置

//router内的设置
    {
      path: '/teachers',
      name: 'TDetail',
      component: TDetail,
      meta: {
        title:"首页",
        content: 'disable'
      }
    },
    {
      path: '/article',
      name: 'Article',
      component: Article,
      meta: {
        title: "文章",
        content: 'disable-no'
      }
    },
  //main.js里面的代码
  router.beforeEach((to, from, next) => {
  /* 路由发生变化修改页面meta */
  if(to.meta.content){
    let head = document.getElementsByTagName('head');
    let meta = document.createElement('meta');
    meta.content = to.meta.content;
    head[0].appendChild(meta)
  }
  /* 路由发生变化修改页面title */
  if (to.meta.title) {
    document.title = to.meta.title;
  }
  next()
});
复制代码
  1. facebook分享的问题;

分享的meta标签里边必须是固定值,js动态加进去是不生效的;

  1. 点击radio会清空所有的checked状态

举例说,比如一个问卷调查,会有很多radio,当用户选择所有题项之后,才让提交按钮变色,当状态值更改的时候,触发了视图更新,这时候所有的raido都会初始的checked装填,就变为空,这时候需要做的就是在项目中,也让checked的状态等于当前选择的;

  1. axios请求的时候,后端拿不到值

参考文章: axios发post请求,后端接收不到参数

  1. 写一个插件,比如一个toast弹窗

新建 toast.js

import ToastComponent from './Toast.vue'
const Toast = {};

// 注册Toast
Toast.install = function (Vue) {
  // 生成一个Vue的子类
  // 同时这个子类也就是组件
  const ToastConstructor = Vue.extend(ToastComponent);
  // 生成一个该子类的实例
  const instance = new ToastConstructor();
  // 将这个实例挂载在我创建的div上
  instance.$mount(document.createElement('div'));
  // 并将此div加入全局挂载点内部
  document.body.appendChild(instance.$el);
  //定义一个外部的变量,用于控制调用多次提示组件时,清除延时器
  let timer;
  // 通过Vue的原型注册一个方法
  // 让所有实例共享这个方法 
  const message_main = {
    all_message(msg, type, duration) {
      clearTimeout(timer);
      timer = setTimeout(() => {
        instance.visible = false;
      }, duration);
      instance.message = msg;
      instance.visible = true;
      instance.type = type;

    },
    success(msg, duration = 3000) {
      this.all_message(msg, 1, duration);
    },
    error(msg, duration = 3000) {
      this.all_message(msg, 2, duration);
    },
  }
  //将方法挂载全局
  Vue.prototype.$toast = message_main;
}

export default Toast
复制代码

新建 toast.vue

<template>
  <div>
    <span v-show="visible" class="dialog-tips">
      {{message}}
    </span>
  </div>
</template>
<script>
export default {
  data() {
    return {
      visible: false,
      message: "",
    };
  }
};
</script>
<style lang="scss" scoped>
  .dialog-tips {
    max-width: 1.4rem;
    white-space: nowrap;
    font-size: .14rem;
    font-weight: bold;
    padding: .1rem .2rem;
    text-align: center;
    color: green;
    background: rgba(204, 204, 204, 0.2);
    position: fixed;
    bottom: .84rem;
    left: 0;
    right: 0;
    margin: auto;
  }
</style>

复制代码

在main.js

这是toast组件挂载vue原型上,哪用哪儿引用就OK?;

  1. 封装axios;
import axios from "axios";

axios.defaults.timeout = 10000;
axios.defaults.baseURL = process.env.API_ROOT; // 域名
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

// 异常处理
axios.interceptors.response.use(
  res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),
  err => {
    if (err && err.response) {
      switch (err.response.status) {
        case 404:
          console.log("找不到该页面");
          break;
        case 500:
          console.log("服务器出错");
          break;
        case 503:
          console.log("服务器失效");
          break;
        default:
          console.log(`连接错误${err.response.status}`);
      }
    } else {
      console.log("连接到服务器失败");
    }
    return Promise.resolve(err.response);
  }
);

export default axios;
复制代码

转载于:https://juejin.im/post/5c5546d9f265da2d8d69b2a6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值