专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序猿  ·  华为,纯血鸿蒙,三分天下有其一 ·  昨天  
OSC开源社区  ·  做开源商业化创业3年,一点小感悟 ·  昨天  
程序员的那些事  ·  微信这个超强功能终于来了,解决很多人的大烦恼 ·  3 天前  
程序员的那些事  ·  趣图:当 Tiktok 难民涌入小红书后 ·  3 天前  
程序员小灰  ·  支付宝 P0 事故,太离谱了。。。 ·  3 天前  
51好读  ›  专栏  ›  SegmentFault思否

深入认识 vue-cli:能做的不仅仅是初始化 vue 工程

SegmentFault思否  · 公众号  · 程序员  · 2017-11-15 08:00

正文

相信对于大部分使用过VueJS的同学来说, vue-cli是他们非常熟悉的一个工具。借助 vue-cli,我们通过非常简单的问答形式,方便地初始化一个vue工程,完全不需要担心繁复的webpack、eslint配置等等。

但是,仍然有许多同学没有搞清楚 vue-clivue工程之间的关系,导致没有充分发挥 vue-cli的功能。在这篇文章中,我将从底层原理开始并结合几个例子,告诉大家 vue-cli还能这样用。

什么是vue-cli

引用vue-cli官方文档的一句话:

A simple CLI for scaffolding Vue.js projects. 一个简单的Vue.js工程命令行脚手架工具。

在全局安装vue-cli之后,就可以通过一条命令初始化我们的vue工程:

  1. vue init

接下来vue-cli就会按照这个 模板内部的设置,抛出几个问答选项。在回答完问答选项以后,我们的vue工程目录就已经生成好了,接下来只要把依赖安装完,直接就可以跑起来,是不是非常方便呢?

接下来,我们就要看看,这一条命令的背后,究竟发生了一些什么事。

vue-cli初始化项目的原理

从官方文档可以知道,vue-cli使用了download-git-repo这个工具去下载远端git仓库里面的工程,如果加上了 --clone参数,则会在内部运行 git clone,通过克隆的方式把远端git仓库拉取到本地。明白这一点至关重要:

vue-cli并非从无到有地凭空生成一个项目,而是通过下载/拉取已有的工程到本地,完成生成项目的工作

而这个“已有的工程”,就是所谓的“模板(template)”。

当然,vue-cli可不只是把模板拉取到本地这么简单,它还允许我们通过问答的形式对模板进行个性化配置,这个又是如何做到的呢?

vue-cli使用了inquirer.js实现了“问答环节”,简单来说是这样子的:

  1. // 准备几个问题

  2. const questions = [

  3.  {

  4.    type: 'input',

  5.    name: 'name',

  6.    message: 'What's your name?'

  7.  },

  8.  {

  9.    type: 'input',

  10.    name: 'age',

  11.    message: 'How old are you?',

  12.  }

  13. ]

然后把这段问题传给inquirer.js就可以了:

  1. inquirer.prompt(questions).then(({ name, age }) => {

  2.  console.log(`My name is ${name}, and I'm ${age} years old`)

  3. })

在运行的时候,vue-cli会在命令行里面把 What's your name?Howold are you?这两个问题相继抛出,获取用户输入,把输入赋值给 nameage变量,这样就能够获取用户的输入信息了。接着我们引出下一个问题,这些用户输入,是如何跟模板的自定义关联起来的呢?

我们打开一个vue-cli的模板,比如webpack-simple里面的README.md,它长这样:

  1. # {{ name }}

  2. > {{ description }}

上面使用双括号包裹起来的,最终会根据用户的输入而更改为具体的内容。是不是觉得这种写法很熟悉?其实就是Handlebars的模板语法。

以这个README.md文件为例,在vue-cli运行的过程中,会首先读取文件的内容放在内存,然后通过 inquirer.js获取用户输入,把输入的值替换到文件内容里面,最后通过另外一个名叫Metalsmith的工具,把替换好的内容输出为文件,也就生成了具有个性化内容的README.md文件了。

整个流程并不复杂,在明白这些原理后,我们就能更深入地使用vue-cli了。

Javascript与Java,Vue-cli与Vue

虽然这么类比不太准确,但我想大家也应该能明白我的意思。

简单来说,就是vue-cli不仅仅能初始化vue工程,理论上能够初始化一切工程,包括react,angular等等等等,只要你有一份能够运行的模板,就能够通过vue-cli进行工程的初始化。

在讨论区有许多类似的问题:

  • “vue-cli当中如何配置sass?”

  • “vue-cli中如何修改devServer的端口?”

  • “vue-cli中发现项目跑不起来”

  • ……

vue-cli说:“这锅我不背。”

是的,所遇到的问题都不是vue-cli的问题,而是相关模板的问题。那么应该如何写一份合格的模板呢?下面我们一起来研究一下。

写一份vue-cli模板

参考官方文档,也许还是不能理解到底应该怎么写,那么我们可以直接参考官方例子webpack-simple,看看它到底是怎么写的。

首先可以看到目录结构:

着实是非常简单,其中 meta.json就是向用户抛出的问答题, /template目录则是真正的模板内容。首先我们来看看 meta.json都写了些啥:

  1. {

  2.  "prompts": {

  3.    "name": {

  4.      "type": "string",

  5.      "required": true,

  6.      "label": "Project name"

  7.    },

  8.    "description": {

  9.      "type": "string",

  10.      "required": true,

  11.      "label": "Project description",

  12.      "default": "A Vue.js project"

  13.    },

  14.    "author": {

  15.      "type": "string",

  16.      "label": "Author"

  17.    },

  18.    "sass": {

  19.       "type": "confirm",

  20.       "message": "Use sass?",

  21.       "default": false

  22.    }

  23.  },

  24.  "completeMessage": "{{#inPlace}}To get started:\n\n  npm install\n  npm run dev.{{else}}To get started:\n\n  cd {{destDirName}}\n  npm install\n  npm run dev.{{/inPlace}}"

  25. }

可以看到,它一共向用户提了4个问题:

  • Project name

  • Project description

  • Author

  • Use sass?

接着,我们打开 /template目录,看看它长什么样:

这就是终将被生成的工程目录。打开里面的 package.json

  1. {

  2.  "name": "{{ name }}",

  3.  "description": "{{ description }}",

  4.  "version": "1.0.0",

  5.  "author": "{{ author }}",

  6.  "private": true,

  7.  "scripts": {

  8.    "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",

  9.    "build": "cross-env NODE_ENV=production webpack --progress --hide-modules"

  10.  },

  11.  "dependencies": {

  12.    "vue": "^2.4.4"

  13.  },

  14.  "devDependencies": {

  15.    "babel-core": "^6.26.0",

  16.    "babel-loader": "^7.1.2",

  17.    "babel-preset-env": "^1.6.0",

  18.    "cross-env": "^5.0.5",

  19.    "css-loader": "^0.28.7",

  20.    "file-loader": "^1.1.4",

  21.    {{#sass}}

  22.    "node-sass": "^4.5.3",

  23.    "sass-loader": "^6.0.6",

  24.    {{/sass}}

  25.    "vue-loader": "^13.0.5",

  26.    "vue-template-compiler": "^2.4.4",

  27.    "webpack": "^3.6.0",

  28.    "webpack-dev-server": "^2.9.1"

  29.  }

  30. }

结合前文原理里面的内容,也不难理解这个 package.json里面双括号的含义了。

看到这里,是不是已经跃跃欲试,想要写一份属于自己的模板呢?又或者想要打造一款属于自己的命令行脚手架工具?原理都是很简单的,只要按照想法一步步实现即可。

后记

其实在去年早些时候,已经写了两篇脚手架相关的文章:

但是发现仍然有许多同学对于vue-cli的理解有些偏差,于是写下这篇文章,聊一聊自己的理解。


相关文章推荐


vue组件开发练习--焦点图切换


一套Vue的单页模板:N3-admin


vuejs开发H5页面总结


Webpack 3,从入门到放弃


轻松入门React和Webpack


相关讲堂推荐


主要内容

  • 从一个简单的例子认识webpack

  • 入口文件和输出文件

  • 认识webpack-loader和webpack-plugin

  • 打包后路径的相关问题

  • webpack-dev-server配置介绍

  • 三文件配置方案

  • 优化webpack的打包性能

  • 学习写一个vue-loader

  • 学习写一个vue-plugin

推荐文章
OSC开源社区  ·  做开源商业化创业3年,一点小感悟
昨天
程序员的那些事  ·  趣图:当 Tiktok 难民涌入小红书后
3 天前
程序员小灰  ·  支付宝 P0 事故,太离谱了。。。
3 天前
不止读书  ·  有了它,每天一次颅内小高潮
7 年前
销售与市场  ·  微信营销宝典!
7 年前
Dynamic Delta - Pure Alpha  ·  策略半年复盘
10 年前