VueCli构建工具


title: VueCli构建工具
date: 2019-08-07 19:35:35
tags: [Vue.js,VueCli,webpack]
categories: Web前端


一、VueCli构建工具

如果我们所有的项目都像原来那样配置,难免过于繁琐。所以Vue官方提供了一个构建工具——VueCli来快速构建一个工具 。他可以帮助我们快速安装webPack的插件、loader等等配套的包。以及帮我们自动化构建配置目录等等。

二、VueCli 2.x

虽然在2018年8月尤雨溪发布了VueCli 3,但是由于现在还有大量的项目都是通过2.x.x版本构建的。所以在此需要记录一下VueCli 2的一些特性。

  • 安装

    npm i @vue/cli -g
    

    虽然是3版本,如果想像2版本那样构建,需要使用他们提供的一个桥接工具

    npm i @vue/cli-init -g
    
  • 构建一个Vue项目(2版本)

    vue init webpack 项目名称
    
  • 接下来要你选择一些关键项

    ? Project name (test)   ##填写项目文件名称
    
    ? Project description (A Vue.js project)  ## 填写项目介绍
    
    ? Author MaoJacky <34392872+JackyM06@users.noreply.github.com>   ## 填写作者信息,默认读取全局git中的信息
    
    ? Vue build  ## 选择一个构建方式,初学者建议选择第一个,后文有介绍这两种方式的区别
      > Runtime + Compiler: recommended for most users
            Runtime-only: about 6KB lighter min+gzip, but templates (or any Vue-specific HTML) are ONLY allowed in .vue files - render functions are required elsewhere
      
    ? Install vue-router? (Y/n) n   ## 是否加载Vue-router
    
    ? Use ESLint to lint your code? No   ## 是否使用一种js代码标准
    
    ? Setup unit tests No   ##是否安装单元测试
    
    ? Setup e2e tests with Nightwatch? (Y/n) n   ##是否安装端对端测试
    
    ? Should we run `npm install` for you after the project has been created? (recommended) (Use arrow keys)   ##选择一种包管理工具
    > Yes, use NPM
      Yes, use Yarn
      No, I will handle that myself
    
  • 生成后的目录

    │  .babelrc
    │  .editorconfig
    │  .gitignore
    │  .postcssrc.js
    │  index.html
    │  package.json
    │  README.md
    │
    ├─build
    │      build.js
    │      check-versions.js
    │      logo.png
    │      utils.js
    │      vue-loader.conf.js
    │      webpack.base.conf.js
    │      webpack.dev.conf.js
    │      webpack.prod.conf.js
    │
    ├─config
    │      dev.env.js
    │      index.js
    │      prod.env.js
    │
    ├─src
    │  │  App.vue
    │  │  main.js
    │  │
    │  ├─assets
    │  │      logo.png
    │  │
    │  └─components
    │          HelloWorld.vue
    │
    └─static
            .gitkeep
    
  • 构建完成😄

三、VueCli 3.x

VueCli 3在原来基础上,减去了build文件夹等等,修改static文件夹为public。官方的话来说就是0配置,那么就让我们来瞅一瞅怎么用的吧

因为上面我们已经安装过了,所以我们只需要换一种构建方式即可。

  • 构建

    vue create 项目名称
    
  • 选择关键项

    ? Please pick a preset: ##选择你的配置方案,一般选择手动
      default (babel, eslint)
    > Manually select features
    
    ? Check the features needed for your project: (Press <space> to select, <a> to toggle all, <i> to invert selection) ##选择需要的关键项
    >(*) Babel
     ( ) TypeScript
     ( ) Progressive Web App (PWA) Support
     ( ) Router
     ( ) Vuex
     ( ) CSS Pre-processors
     (*) Linter / Formatter
     ( ) Unit Testing
     ( ) E2E Testing
     
     
     ? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.?
     ##你要将的一些Babel配置信息保存到哪里,可以选择保存到Package.json,或自定义文件中去
     
     ? Save this as a preset for future projects? (y/N)y
     ##是否将你的这些配置信息保存下来,在未来能够使用
    

    注:如果要删除你所保存的个人配置信息项 ,你可以在C盘用户目录下的.vuerc文件中管理

    VueCli 3开始,还提供了一个vue ui命令,可以让你在可视化工具上进行修改你的项目配置

  • 文件目录

    │  .browserslistrc
    │  .gitignore
    │  babel.config.js
    │  package-lock.json
    │  package.json
    │  postcss.config.js
    │  README.md
    │
    ├─public
    │      favicon.ico
    │      index.html
    │
    └─src
        │  App.vue
        │  main.js
        │
        ├─assets
        │      logo.png
        │
        └─components
                HelloWorld.vue
    

    注意:VueCli3构建的默认是Runtime-only方式的,可以在可视化工具中修改

四、关于Runtime方式的说明

4.1 问题说明

VueCli 2中构建Vue项目时,有一个让你选择runtime-compiler or runtime-only。那这两者有什么区别呢?

先看一下分别使用两种方式构建的main.js

  • runtime-compiler
import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  components: { App },
  template: '<App/>'
})

  • runtime-only
import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  render: h=>h(App)
})
  • render使用方式
  render: function(createElement){
    // 1.普通用法 createElement(标签名,{属性},[内容或者嵌套使用createElement])
    return createElement(
      'h2',
      {class:'box'},
      [
        '我是魔鬼',
        createElement('p',{class:'pp'},['hello'])
      ])
   // 2.真正的用法 createElement(导入的组件)
      return createElement(App)
  }

4.2 两种方式的区别

显然,前者是用我们熟悉的方式引用的App组件,而后者是以render函数的方式出现。这到底是怎么回事呢?

我们首先需要看一下Vue程序的过程

首先将template解析为ats-抽象语法树,然后使用vue实例中的render方法将ats编译为虚拟节点,然后建立vDom-虚拟Dom树,最终把vDom转换为我们在浏览器上所能看到的ui

简单来说就是:

template-> ats->render->vDom->ui

那么,对于runtime-compiler方式来说,就是完整的用上述流程运行的。

而对于runtime-only来说,他是直接从render开始(render->vDom->ui)。显然这种方式的性能更高。

4.3 最后的问题

也许各位也会有一个疑问,那再子组件中挂载其他子组件岂不是都需要用render方法来做了?

我们来看看App.vue的内容

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld'

export default {
  name: 'App',
  components: {
    HelloWorld
  }
}
</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>

显然,在导出对象中我们并没有使用render方法来挂载子组件,这是为撒子呢🤔

看过我上一篇关于webpack的文章的童鞋应该知道,我们在使用webpack导入vue文件使安装了两个东西。

其中一个是为了支持.vue文件导入的vue-loader,还有一个是vue-template-compiler。而在VueCli构建中,这些它已经自动为我们安装了。

它能够在导出过程中将template编译为一个ast,我们只需要按原来的方式来挂载组件,最后形成一颗抽象语法树,在main.js中我们只需要使用render方法就可以。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容