Vue+webpack 构建前端页面初探

2019-04-25  本文已影响0人  雕兄L

前言:本文适合后端同学快速了解基于vue的前端开发

Vue

学习成本:一周
Vue是一个js框架,承担和dom交互的职责,使开发人员在写js的时候,不用再去获取dom的对象并修改dom属性值,js写起来有点面向对象的感觉,对于后端研发来说相当好用。
官网:https://cn.vuejs.org

用Vue构建一个简单的计算器

简单实现一个可以加减乘除的计算器,并以这个实例介绍Vue基本用法


计算器目标效果图
<script>
  var app1 = new Vue({
    el: '#app-1',
    data: { //计算器属性
      v1: 0,
      action: '+',
      v2: 0,
      result: 0
    },
    methods: { //计算器方法
      calculate() {
        switch (this.action) {
          case '+':
            this.result = parseInt(this.v1) + parseInt(this.v2);
            break;
          case '-':
            this.result = this.v1 - this.v2;
            break;
          case '*':
            this.result = this.v1 * this.v2;
            break;
          case '/':
            this.result = this.v1 / this.v2;
            break;
        }
      }
    }
  });

</script>

以上的js代码,Vue对象里声明了计算器需要的属性和方法
Vue里面可以声明对象属性,方法,生命周期函数等,需要分别写在Vue对应的data、methods等属性中

计算器的方法、属性在js里声明好了,接下来要做的就是把方法和属性分别和html标签绑定起来

<body>
<div id="app-1">
  <input type="text" v-model="v1">
  <select v-model="action">
    <option value="+">+</option>
    <option value="-">-</option>
    <option value="*">*</option>
    <option value="/">/</option>
  </select>
  <input type="text" v-model="v2">
  <span>=</span>
  <input type="text" v-model="result">
  <button v-on:click="calculate">计算</button>
</div>
</body>

以上是html代码,把整段代码运行起来就能实现计算器效果。
关于如何绑定方法属性的说明:

使用vue实现交互式逻辑,js代码比较简洁,只需专注其逻辑实现,dom的操作由vue自动完成

Vue组件

组件就是封装一个可以复用的模块,比如实现一个分页的组件,其他页面可以复用.
下面通过伪码实现一个分页组件

<body>
<div id="app2">
  <!--html里使用分页组件-->
  <pagination :total="total" :current-page.sync="currentPage" :page-size="pageSize" @currentPageChange="pageChange()"></pagination>
</div>
</body>

<!--组件模板-->
<template id="pagination-template">
  <div>
    <button @click="pre()">上一页</button>
    <div v-for="cur in pageNumbers">
      <a @click="clickCur(cur)">${{cur}}</a>
    </div>
    <button @click="next()">下一页</button>
  </div>
</template>
<script>
//定义一个pagination
var pagination = new Vue({
    template: "#pagination-template",
    props: [total, currentPage, pageSize],//需要外部父组件给该组件传值时,在props里声明属性
    data: function () {//组件里的属性应该声明在方法里返回,组件复用时不会共享变量
      return {
        pageNumbers: [1,2,3,4,5,6,7,8]   //假定数组里是这些数字
      }
    },
    methods: {
      pre() {
        //...
      },
      next() {
        //....
      },
      clickCur(cur) {
        //修改currentPage的值
        //调用父组件绑定的currentPageChange事件
        this.$emit("currentPageChange");
      }
    }
  });


//父组件
//引用pagination组件
 var app2 = new Vue({
        el: "#app2",
        data: {
          currentPage: 0,
          pageSize: 20,
          total: 0
        },
        methods: {
          pageChange() {
            //刷新页面
          },
          listData() {
            //获取数据
          }
        },
        components: {
          'pagination': pagination //局部注册组件
        },
        created: function () { //页面初始化之前发起xmlHttpRequest加载业务数据
          this.listData();
        }
      });
 
</script>

用伪码实现一个分页组件,在app2中注册了一个名为pagination的组件,并在html中使用了<pagination></pagination>组件。

我们后端程序员写的页面一般不会太复杂,开发复用组件的情况比较少,更多的是使用别人开源出来的组件,了解组件间传值,属性同步,方法回调的实现还是很有必要。

单页面应用路由问题

学习成本:0.5天
单页面应用简单的说就是html里的页面一次加载出来,后续页面跳转都在页面内进行,除了数据需要从服务端加载,其他页面都是在页面内跳转,不再请求服务器,典型的url写法: /home/#/page1,页面间跳转使用#分割。详细介绍请自行查阅资料。

使用Vue会涉及到多个页面之间跳转如何在单页面内路由问题,即组件之间跳转问题,vue的路由使用Vue Router实现,参考https://router.vuejs.org/zh/

组件之间状态同步问题

多个组件之间涉及状态同步,比如左边菜单组件和页面上方标签组件之间状态同步问题,实现类库参考https://vuex.vuejs.org/zh/

Vue相关生态

NPM的使用

学习成本:无

Vue 可以直接在页面通过<script></script>标签引用,不过这种方式现在有点low了,就好比在java项目中,对依赖的jar包,还人工下载相应版本,然后copy到lib目录下一样。

使用NPM可以对依赖的包通过命令安装管理,npm依赖NodeJs环境,到官网下载一个NodeJs安装之后就可以使用npm命令。相关教程自行查阅。
常见命令:
npm install + packageName安装包
npm init初始化项目信息(创建一个package.json文件)

npm类似于java的maven,在项目根目录下创建一个pakage.json(类似pom.xml)文件,里面声明上项目信息和依赖哪些包,然后别人拿到项目之后,再npm install一下就能把所有依赖的包都下载到本地环境;另外当运行npm install+包名 安装依赖时,也会自动在pakage.json里加入这个包的依赖信息。注意在这个json文件里不能加注释,会报错

{
  "name": "speech-test-html",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "ajv": "^6.7.0",
    "element-ui": "^2.4.5",
    "file-saver": "^2.0.0",
    "less": "^3.9.0",
    "semantic-ui-icon": "^2.3.3",
    "vue": "^2.5.21"
  },
  "devDependencies": {
    "@types/file-saver": "^2.0.0",
    "@vue/cli-plugin-babel": "^3.3.0",
    "@vue/cli-plugin-eslint": "^3.3.0",
    "@vue/cli-service": "^3.3.0",
    "babel-eslint": "^10.0.1",
    "copy-webpack-plugin": "^4.6.0",
    "eslint": "^5.8.0",
    "eslint-plugin-vue": "^5.0.0",
    "less-loader": "^4.1.0",
    "semantic-ui-less": "^2.4.1",
    "vue-cli-plugin-element": "^1.0.1",
    "vue-resource": "^1.5.1",
    "vue-router": "^3.0.2",
    "vue-template-compiler": "^2.5.21"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "rules": {
      "no-console": "off"
    },
    "parserOptions": {
      "parser": "babel-eslint"
    }
  },
  "postcss": {
    "plugins": {
      "autoprefixer": {}
    }
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ]
}

使用npm安装完一个包后,在js文件里可以通过require引用这个包,也可以用import引用
注意: require是nodejs的命令,import是ECMAScript 6的语法

webpack的使用

学习成本:1天
webpack也需要通过npm安装,这个工具的作用就是把项目里的各种html js css依赖文件编译到一个文件里,并进行压缩,缩小静态文件体积,可以减少浏览器加载html的时候发起的请求,加载速度要快一点。另外在使用第三方库的时候,可以按需引入相关组件
官网地址: https://www.webpackjs.com/guides/
webpack 其实就是一个集成了解析html css js 等文件的工具,也就是各种loader,比如css-loader vue-loader babel-loader,这些loader都需要使用npm 安装,然后需要在webpack.config.js里配置各种文件应该使用什么loader加载,怎么加载,还有webpack把项目资源都打包完的压缩文件放在哪个目录。这些配置一般都比较固定,没有特殊需求基本就是模板代码。

const {VueLoaderPlugin} = require('vue-loader')

module.exports = {
    entry: __dirname + "/src/main.js",
    mode: "development",
    output: {
        path: __dirname + '/dist',
        filename: "bundle.js"
    },
    module: {
        rules: [
            {test: /\.vue$/, use: ['vue-loader']},
            {test: /\.css$/, use: ['style-loader', 'css-loader']},
            {
                test: /\.js$/,
                exclude: /(node_modules|bower_components)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env'],
                        plugins: ['@babel/plugin-transform-runtime', "@babel/plugin-proposal-class-properties"]
                    }
                }
            }
        ]
    },
    resolve: {
        alias: {
            'vue$': 'vue/dist/vue.esm.js' // 用 webpack 1 时需用 'vue/dist/vue.common.js'
        }
    },
    plugins: [
        // make sure to include the plugin for the magic
        new VueLoaderPlugin()

    ]

};

webpack-dev-server

使用webpack后必须要使用的一个热加载插件,实现html css js更改后浏览器可以实时刷新出内容,不用人工去点刷新
使用参考官网:https://webpack.docschina.org/guides/development/#%E4%BD%BF%E7%94%A8-webpack-dev-server
这个服务会使用nodejs启动一个http服务,我们访问这个服务地址去查看编写的代码效果

vue-cli脚手架使用

学习成本:0.5小时
看到这里有没有感觉除了vue,其他要学习的东西也挺多,心里发慌!
不过不用怕,vue-cli就是一个类似于java里的springboot,使用vue-cli之后,可以直接初始化出一个vue开发环境出来,把以上关于webpack 和 webpack-dev-server的配置都搞好了,如果没有什么特殊需求,基本不用再去改配置!
参考官网:https://cli.vuejs.org/
https://github.com/lin-xin/vue-manage-system这个开源模板也是基于vue-cli的,可以参考下这个项目的使用就能get到这个脚手架怎么用

上一篇下一篇

猜你喜欢

热点阅读