Catalog
  1. 1. 启动项目
  2. 2. 项目目录
  3. 3. Store全局变量
  4. 4. Vuex
  5. 5. API
    1. 5.0.1. Components
  • 6. Webpack
    1. 6.1. 模块化演进
      1. 6.1.1. Script标签
      2. 6.1.2. CommonJS
      3. 6.1.3. AMD
      4. 6.1.4. CMD
      5. 6.1.5. ES6模块
    2. 6.2. 安装Webpack
    3. 6.3. 配置Webpack
    4. 6.4. 使用Webpack
  • 7. Vue-router
    1. 7.1. 安装
    2. 7.2. 测试
    3. 7.3. 路由嵌套
  • Vue学习记录

    启动项目

    1. 修改项目配置文件

      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
      {
      "name": "jhzxxmgl_man", //项目名称
      "version": "0.1.0", //项目版本
      "private": true,
      "scripts": { //npm run serve 要运行的脚本
      "serve": "vue-cli-service serve --port 8102", //serve脚本通过--port修改端口号
      "build": "vue-cli-service build",
      "lint": "vue-cli-service lint"
      },
      "dependencies": { //项目依赖
      "core-js": "^3.3.2",
      "vue": "^2.6.10",
      "vue-class-component": "^7.0.2",
      "vue-property-decorator": "^8.3.0",
      "vue-router": "^3.1.3",
      "vuex": "^3.0.1"
      },
      "devDependencies": { //开发依赖
      "@vue/cli-plugin-babel": "^4.0.0",
      "@vue/cli-plugin-eslint": "^4.0.0",
      "@vue/cli-plugin-typescript": "^4.0.0",
      "@vue/cli-service": "^4.0.0",
      "@vue/eslint-config-prettier": "^5.0.0",
      "@vue/eslint-config-typescript": "^4.0.0",
      "eslint": "^5.16.0",
      "eslint-plugin-prettier": "^3.1.1",
      "eslint-plugin-vue": "^5.0.0",
      "prettier": "^1.18.2",
      "sass": "^1.19.0",
      "sass-loader": "^8.0.0",
      "typescript": "~3.5.3",
      "vue-template-compiler": "^2.6.10"
      }
      }

    1. 进入项目目录,启动服务
    1
    2
    cd <Project-Name>
    npm run serve

    在浏览器中输入localhost:port, 其中port为上方配置文件的内的端口,就可以访问vue的框架demo了

    项目目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    .
    ├── README.md 项目介绍
    ├── babel.config.js babel配置文件
    ├── node_modules 依赖
    ├── package-lock.json
    ├── package.json 依赖配置
    ├── postcss.config.js
    ├── public 公共文件
    │   ├── favicon.ico
    │   └── index.html
    ├── src 源码
    │   ├── App.vue 页面主入口
    │   ├── assets 项目中需要用到的资源文件,css、js、images
    │   ├── components 公共组件:header.vue、footer.vue等
    │   ├── main.ts vue-cli工程的入口文件
    │   ├── router vue路由的配置文件
    │   ├── shims-tsx.d.ts
    │   ├── shims-vue.d.ts
    │   ├── store 全局数据
    │   └── views 图像层
    └── tsconfig.json TypeScript配置

    Store全局变量

    ​ 在使用vue-cli初始化项目时选择了Vuex,在项目目录中在src下出现一个store的文件夹,里面会存放一个index.ts的文件

    Vuex

    API

    Components

    • template标签内只能有一个根节点

    Webpack

    模块化演进

    Script标签

    1
    2
    3
    4
    <script scr="module1.js"></script>
    <script scr="module2.js"></script>
    <script scr="module3.js"></script>
    <script scr="module4.js"></script>
    • 全局作用域下容易造成变量冲突
    • 文件只能按照<script>的书写顺序进行加载
    • 开发人员必须主管解决模块和代码库的依赖关系
    • 在大型项目中各种资源难以管理,长期积累的问题导致代码库混乱不堪

    CommonJS

    服务器遵从CommonJS规范,该规范核心思想是允许模块通过require方法来同步加载所需依赖的其他模块,然后通过exports活module.exports来导出需要暴露的接口

    1
    2
    3
    4
    require("module");
    require("../module.js");
    export.doStuff = function() {}
    module.exports = someValue;

    优点:

    • 服务器端模块便于启用
    • NPM中已经有超过45万个可以使用的模块包
    • 简单易用

    缺点:

    • 同步的模块加载方式不适合在浏览器环境中,同步意味着阻塞加载,浏览器资源师异步加载的
    • 不能非阻塞的并行加载多个模块

    实现:

    • 服务端的NodeJS
    • Browserify, 浏览器短的CommonJS实现,可以使用NPM的模块,但是编译打包后的文件体积较大
    • modules-webmake, 类似Browserify,但不如Browserify灵活
    • wreq,Browserify的前身

    AMD

    Asynchronnous Module Definition 规范其实主要的接口define(id?, dependencies?, factory); 它要在声明模块的时候指定所有的依赖dependencies, 并且还要当做形参传到factory中,对于以来的模块提前执行

    1
    2
    3
    4
    define("module", ["dep1", "dep2"], function(d1,d2) {
    return someExporteValue;
    });
    require(["module", "../file.js"], function(module, file) {});

    优点:

    • 适合在浏览器环境中异步加载模块
    • 可以并行加载多个模块

    缺点:

    • 提高了开发成本,代码的于都和书写比较困难,模块定义方式的语义不畅
    • 不符合通用的模块化思维方式,是一种妥协的体现

    实现:

    CMD

    Commons Module Definition 规范和AMD很相似,尽量保持简单,并与CommonJS和NodeJS的Modules规范保持了很大的兼容性.

    1
    2
    3
    4
    5
    6
    define(function(require, exports, module) {
    var $ = require("jquery");
    var Spinning = require("./spinning");
    exports.doSomething = ...;
    module.exports = ..;
    });

    优点:

    • 依赖就近,延迟执行
    • 可以很容易在NodeJS中运行

    缺点:

    • 依赖SPM打包,模块的加载逻辑偏重

    实现:

    • Sea.js
    • coolie

    ES6模块

    EcmaScript6 标准增加了JavaScript语言层面的模块体系定义。ES6模块的设计思想,是尽量静态化,使编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS和AMD模块,都只能在运行时确定这些东西。

    1
    2
    3
    import "jquery";
    export function doStuff() {}
    module "localModule" {}

    优点:

    • 容易进行静态分析
    • 面向未来的EcmaScript标准

    缺点:

    • 原生浏览器端还没有实现该标准
    • 全新的命令,新版的NodeJS才支持

    实现:

    安装Webpack

    WebPack是一款模块加载器兼打包工具,它能把各种资源,如JS、JSX、ES6、SASS、LESS、图片等都作为模块来处理和使用

    安装:

    1
    2
    npm instal webpack -g	#全局安装
    npm install webpack-cli -g

    测试:

    • webpack -v
    • webpack-cli -v

    配置Webpack

    创建`webpack.config.js`配置文件
    • entry: 入口文件,指定WebPack用哪个文件作为项目的入口
    • output: 输出,指定WebPack把处理完成的文件放置到指定路径
    • module: 模块,用于处理各种类型的文件
    • plugins: 插件,如:热更新、代码重用等
    • resolve: 设置路径指向
    • watch: 监听,用于设置文件改动后直接打包

    使用Webpack

    1. 创建项目

    2. 创建一个名为modules的目录,用于放置JS模块等资源文件

    3. 在modules下创建模块文件,如hello.js,用于编写JS模块相关代码

      1
      2
      3
      exports.sayHi = function() {
      document.write("<div>Hello Webpack!</div>");
      }
    4. 在modules下创建一个名为main.js的入口文件,用于打包是设置entry属性

      1
      2
      var hello = require("./hello");
      hello.sayHi();
    5. 在项目目录下创建webpack.config.js配置文件,使用webpack命令打包

      1
      2
      3
      4
      5
      6
      module.exports = {
      entry: "./modules/main.js",
      output: {
      filename: "./js/bundle.js"
      }
      }

    Vue-router

    ​ Vue Router是Vue官方,它和Vue.js的核心深度集成,让构建单页面变得易如反掌。包含的功能:

    • 嵌套的路由/视图表
    • 模块化的、基于组件的路由配置
    • 路由参数、查询、通配符
    • 基于Vue.js过渡系统的视图过渡效果
    • 细粒度的导航控制
    • 带有自动激活的CSS class的链接
    • HTML5历史模式或hash模式,在IE9中自动降级
    • 自定义的滚动条行为

    安装

    ​ 基于第一个vue-cli进行测试学习,先查看node_modules中是否存在vue-router

    ​ vue-router是一个插件包,所以我们还是需要用npm/cnpm来进行安装的。打开命令行工具,进入你的项目目录,输入下面命令。

    1
    npm install vue-router --save-dev

    ​ 如果在一个模块化工程中使用它,必须要通过Vue.use()明确地安装路由功能:

    1
    2
    3
    4
    import Vue from 'vue'
    import VurRouter from 'vue-router'

    Vue.use(VueRouter); #显示声明

    测试

    1. 先删除没有用的东西

    2. components目录下存放我们自己编写的组件

    3. 定义一个Content.vue的组件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <template>
      <div>
      <h1>内容页</h1>
      </div>
      </template>
      <script>
      export default {
      name: "Content"
      }
      </script>
    4. 安装路由,在src目录下,新建一个文件夹: router,专门存放路由

      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
      import Vue from 'vue'
      import Router from 'vue-router'
      import Content from '../components/Content'
      import main from '../components/main'

      // 安装路由
      Vue.use(Router)

      // 配置导出路由
      export default new Router({
      routes: [
      {
      // 路由路径
      path: '/content',
      name: 'Content',
      // 路由跳转组件
      component: Content
      }, {
      // 路由路径
      path: '/main',
      name: 'main',
      // 路由跳转组件
      component: main
      }
      ]
      })

    5. main.js中配置路由

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      import Vue from 'vue'
      import App from './App'
      // 自动扫描router下的index文件,Vue-router在index.js中已经显示声明
      import router from './router'

      Vue.config.productionTip = false

      new Vue({
      el: '#app',
      // 配置路由
      router,
      components: { App },
      template: '<App/>'
      })
    6. App.vue中使用路由

      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
      <template>
      <div id="app">
      <h1>Vue-Router</h1>
      <router-link to="/main">首页</router-link>
      <router-link to="/content">内容页</router-link>
      <router-view/>
      </div>
      </template>

      <script>
      export default {
      name: 'App'
      }
      </script>

      <style>
      #app {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
      }
      </style>

      路由嵌套

    ​ 嵌套路由又称为子路由,在实际应用中,通常由多层嵌套的组件组合而成。同样地,URL中各段动态路径也按照某种结构对应嵌套的各层组件,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    /user/foo/profile                     /user/foo/posts
    +------------------+ +-----------------+
    | User | | User |
    | +--------------+ | | +-------------+ |
    | | Profile | | +------------> | | Posts | |
    | | | | | | | |
    | +--------------+ | | +-------------+ |
    +------------------+ +-----------------+

    学习链接:https://www.bilibili.com/video/BV18E411a7mC

    Author: Oven Guo
    Link: http://ovenguo.cn/2019/11/06/vue%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    Donate
    • 微信
    • 支付宝