• Vue-eBookReader 学习笔记(初始化部分)


    vue开发

    初始化

    1 搭建脚手架

    • 本来是输入指令 vue create project-name,但这样输入之后发现无法切换选项,所以将指令改为 winpty vue.cmd create project-name

    • 结束一堆配置之后,输入 npm run serve 启动服务器能成功启动后,输入 npm run build将项目打包,打开dist目录下的index.html,没有任何东西,打开控制台也是一堆bug,是因为路径问题,所以要进行修改:

      • 在根目录下添加一个vue.config.js文件,专门用来做vue中的配置
      • 在里面写上以下内容
    module.exports = {
      //注意,这里不是baseUrl,而是publicPath
      publicPath: process.env.NODE_ENV === 'production'
      ? './'
      : '/'
    }
    
    • 同时在package.json文件中也可以修改下面这两项来适应自己的习惯:
    "dev": "vue-cli-service serve",
    "build": "vue-cli-service build",
    

    2、epubjs核心工作原理

    • epub电子书通过epubjs实例化一个Book对象,Book对象会对电子书进行解析;
    • Book通过renderTo方法生成rendition对象,rendition主要负责电子书的渲染;
    • 通过rendition可得到Theme对象,Theme负责电子书的样式和主题(字号主题);
    • Book还能得到Location对象,负责定位,实现拖动进度条时快速定位的过程;
    • Book还能生成Navigation对象,用来展示电子书目录,并提供目录所在路径。

    3项目准备工作

    3.1 导入准备好的字体图标,并进行引用等一系列工作

    3.2 下载好 sass相关的依赖包,cnpm i --save-dev node-sass sass-loader

    3.3 引入字体,有下面两种引入方式:

    • 利用CSS引入:先将准备好的字体放到 public/fonts文件夹内,在public/index.html里添加link标签来引入 <link rel="stylesheet" href="<%= BASE_URL %>fonts/cabin.css">,再直接在文件中使用相应的字体即可
    • 利用JS引入:将准备好的字体放到 src/assets/fonts文件夹内,在main.js中利用js引入,即import './assets/fonts/cabin.css'

    3.4 配置viewport配置

    • viewport用来设置用户在手机上的可视区域;
    • width=device-width:指定viewport宽度为设备宽度,initial-scale-1.0:指定默认缩放比例为1:1;
    • 通过maximum-scale和minimum-scale限定屏幕缩放比例为1:1,通过user-scalable限制用户对屏幕进行缩放。

    3.5 rem配置

    • rem是css3新增的一个相对单位长度
    • rem的值相当于根元素font-size值的倍数;
    • 这里在 DOMContentLoaded事件动态设置根元素font-size:
    html.style.fontSize = window.innerWidth / 10 + 'px'
    
    document.addEventListener('DOMContentLoaded', () => {
      const html = document.querySelector('html')
      let fontSize = window.innerWidth / 10
      fontSize = fontSize > 50 ? 50 : fontSize
      html.style.fontSize = fontSize + 'px'
    })
    
    • reset.css和global.css

    global.scss中设定了:

    $ratio: 375 / 10 ;
    @function px2rem($px) {
    	@return $px / $ratio + rem;
    }
    

    这里$ratio值的设定是由用户决定的,可以根据自己的实际需要(或者UI设计稿)进行修改

    这个值决定了px2rem输出的结果,如果设定为37.5,那么px2rem(20),表示在375px宽度的屏幕下,显示为20px,计算方法如下:

    • 第一步:375px宽度的屏幕,1rem=37.5px(因为在App.vue中指定了html的font-size=375px/10=37.5px,所以1rem=37.5px)

    • 第二步:计算px2rem(20)=(20/37.5)rem

    • 第三步:将rem转化为px:(20/37.5) * 1rem = 20/37.5 * 37.5px = 20px

    如果屏幕为414px,那么px2rem(20)的计算结果为:

    px2rem(20)=(20/37.5)*41.4px=22.08px

    从而实现了自适应布局,因为px2rem(20)会随屏幕宽度放大或缩小,这是一道数学题

    直接输出结论:

    • $ratio的值可以由用户随意设定

    • 当设置为37.5时,表示以屏幕宽度375px为基准

    • 如果屏幕宽度大于375px,使用px2rem()方法计算出的值会等比例扩大

    • 如果屏幕宽度小于375px,使用px2rem()方法计算出的值会等比例缩小

    4 vuex的使用(初步)

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,也就是帮助我们管理组件间传值,更加快捷。

    4.1 具体步骤

    vuex

    • 在组件内通过dispatch方法调用actions中定义好的方法:

      • this.$store.dispatch('setTest', 2)
    • 在actions定义好的方法中通过commit调用mutations里的方法:

      • setTest ({ commit, state }, newTest) {
          return commit('setTest', newTest)
        }
        
    • 在mutations中定义好修改state中值的方法:

      • setTest (state, newTest) {
          state.test = newTest
        }
        
    • 这里commit其实返回的是一个promise对象,所以在组件内通过dispatch调用setTest方法时就可以加上回调函数来处理成功或失败后的结果:

      • this.$store.dispatch('setTest', 2).then(
          () => {
            console.log(this.$store.state.book.test)
          }
        )
        

    4.2 vuex模块化

      当需要管理的state中变量过多的时候,放到一个文件中就会显得十分臃肿且不便于管理,所以这里也用到了模块化的思想:

    • 在store文件夹下再创建一个modules文件夹,用于存放各模块单独的state;
    • 每个state是个对象,再用 export default 导出即可,再在index.js中引入该模块;
    • 同时在组件中使用的时候, 在state后面还要加上模块中定义的对象的名字。

    4.3 线上调试vue

    • GitHub搜索vue-devtools,找到vuejs/vue-devtools/tree/master/shells/electron下的remote-tools;
    • npm install -g @vue/devtools安装后,输入vue-devtools,启动(注意要在index.html)中加上<script src="http://localhost:8098"></script>,这样就能和chrome提供的vue工具一样了(注意在线上发布的时候要将这句话删掉)

    4.4 getters和mapGetters的使用

      每次在组件里都通过 this.$state.book.test 来找vuex中的数据未免过于复杂了一点,可读性也不太好,所以这里通过getters和mapGetters组合起来,让子组件里可以通过 this.test直接找到这个变量。

    • 可以直接在store下的index.js文件内写getters也可以将getters作为一个新的组件放进modules,这里就用第一种方式;

    • Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算;

      • getters: {
          test: state => state.book.test
        }
        
    • 接着在组件中,引入mapGettersimport { mapGetters } from 'vuex'

    • 之前也说过,这个就像是store的计算属性,所以这里将mapGetters 得到的值放到组件的计算属性里,但是计算属性的值本身就是一个对象,所以要通过ES6的语法——扩展运算符:...来将mapGetters得到的对象中的变量合并到计算属性中:

      • computed: {
          //这样就可以在组件里通过 this.test直接访问,因为这个时候test以及变成组件里计算属性里的一个变量了
          ...mapGetters(['test'])
        },
        
    • 那mapGetters到底是干什么的?mapGetters(keys)

      • keys是一个数组,它将遍历数组中的值,在getters中去寻找有无该key值对应的键,若存在则将其加入到要返回的对象中,具体举例如下:
    const getter = {
      a: () => 1,
      b: () => 2
    }
    function fn (keys) {
      const data = {}
      keys.forEach(key => {
        //这里不直接写getter.hasOwnProperty(key)是因为这样代码不规范,原因见博客
        if (Object.prototype.hasOwnProperty.call(getter, key)) {
          data[key] = getter[key]
        }
      })
      return data
    }
    export default {
      computed: {
        //这样就会将fn中,有a b的值放进计算属性内
        ...fn(['a', 'b'])
      },
      mounted () {
        //由于a b已经是计算属性中的值,所以可以直接这样引用
        console.log(this.a, this.b)
      }
    }
    

    5 Nginx服务器搭建

    • 下载完毕后,进入文件夹 用命令行打开

    • start nginx:启动服务,成功后在浏览器输入 localhost即可打开

    • vi conf/nginx.conf查看配置文件,以及之后自己要搭建的服务器也在这里写

    • ./nginx.exe -s stop停止当前服务

    • 要自己搭建服务器,打开配置文件,在里面加上:

      • server {
        	listen 8081;
        }
        
    • ./nginx.exe -s reload重新加载配置文件

    • 修改文件完毕可以用 ./nginx.exe -t来检查语法

    • 继续修改配置文件以搭建服务器:

      • server {
                listen 8081; //监听端口
                server_name resource;
                root C:/Users/ARASHI/Desktop/resource; //文件路径,差点没害死我
                autoindex on; //是否查看resource文件列表
            }
        
    • 打开页面之后可以看到,就成功搭建了服务器:image-20200709085953751

    • 最后再加上跨域和缓存方面的配置:

      • location / {
                        add_header Access-Control-Allow *;
                }
                add_header Cache-Control "no-cache, must-revalidate";
        
    • 注意,这里如果在resource目录下有index.html文件,首页会直接显示它,而不会去显示目录!

  • 相关阅读:
    Linux服务器因为Nginx日志access.log文件过大项目无法访问的问题
    【译】StackExchange.Redis 中文文档(二)配置
    【译】StackExchange.Redis 中文文档(一)基础
    Redis应用(一)实时在线用户
    [.NET]Thread与Task的区别
    并查集(UnionFind)技巧总结
    [LeetCode题解]377. 组合总和 Ⅳ
    [LeetCode题解]216. 组合总和 III
    [LeetCode题解]39. 组合总和
    [LeetCode题解]40. 组合总和 II
  • 原文地址:https://www.cnblogs.com/TRY0929/p/13586576.html
Copyright © 2020-2023  润新知