当前位置: 首页 > 编程日记 > 正文

用 cooking 搭建一个简单又优雅的 Vue 项目开发环境 (入门篇)

本文适合 Vue 的初学者,以及对 webpack 不熟悉的同学阅读。前提是你要会用基本的命令行、 Node 和 NPM,以及掌握 ES2015 的基础知识。本文都是在 macOS 环境下运行,要求使用 npm >= 3, node >= 4 的环境。我们会以 Vue 2.0 搭配 Webpack 2.0 作为教程。

写过 Vue 项目的同学或多或少都用过 vue-cli 来搭建 Vue + webpack 的项目。对于初学者来说,第一次生成这个项目后有所顾忌 —— 生成那么多 webpack 的配置文件到底 TM 是干嘛用的?

纯 webpack 搭建 Vue 项目确实需要许多配置去处理 vue 文件、CSS 预处理、静态资源、以及压缩、热替换等等内容。一开始接受不了这么多也很正常。其实很多时候这些 webpack 配置都可以标准化甚至封装起来,简化其配置。cooking 就是为我们做了这件事,有了它我们就可以很轻易搭建一个 Vue 项目的开发环境。下面我将一步步的教你从零开始搭建 Vue 项目。

创建一个空项目

没什么好说的,创建一个目录然后进入,然后初始化 git 和 npm,填一下相关信息。

mkdir my-vue && cd my-vue && git init && npm init

安装 cooking

如果不用 vue-cli 可能我们并不清楚搭建 Vue 环境需要哪些依赖。没关系,先安装 cooking 再说。

npm i cooking -D # i 是 install 的简写,-D 是 --dev-save 的简写

如果访问 NPM 较慢的话,安利下 python 发烧友写的 npminstall,简单用法如下,下面我将都是用 npminstall 替代 npm i

npm i npminstall -g --registry=https://registry.npm.taobao.org
# 然后就可以用它来安装依赖了
npminstall cooking -D

安装完 cooking 后会有提醒你安装一串依赖列表,这些也就是搭建一个最基础的前端开发环境会用到的东西:babel 处理 ES2015;postcsscss-loaderstyle-loader 处理 CSS 文件;html-webpack-plugin 用来生成 HTML 模板等等。当然这里暂时不用关心这些。我们只需要安装这些依赖即可。

├── UNMET PEER DEPENDENCY babel-core@^6.0.0
├── UNMET PEER DEPENDENCY babel-loader@^6.0.0
├── UNMET PEER DEPENDENCY css-loader@^0.24.0
├── UNMET PEER DEPENDENCY extract-text-webpack-plugin@^1.0.0 || ^2.0.0-beta
├── UNMET PEER DEPENDENCY file-loader@^0.9.0
├── UNMET PEER DEPENDENCY html-loader@^0.4.3
├── UNMET PEER DEPENDENCY html-webpack-plugin@^2.9.0
├── UNMET PEER DEPENDENCY json-loader@^0.5.4
├── UNMET PEER DEPENDENCY postcss@^5.1.0
├── UNMET PEER DEPENDENCY postcss-loader@^0.11.1
├── UNMET PEER DEPENDENCY style-loader@^0.13.1
├── UNMET PEER DEPENDENCY url-loader@^0.5.7
├── UNMET PEER DEPENDENCY webpack@^1.12.0 || ^2.1.0-beta
└── UNMET PEER DEPENDENCY webpack-dev-server@^1.14.0 || ^2.1.0-beta

这时候我们要做选择,是打算用 webpack 1 还是 2 搭建环境,两者 API 都些许变化、但是在 cooking 内部有做一些兼容处理,也就是说其实用 1 还是 2 我们要写的配置是一样的。

如果选择安装 webpack 1 那么就安装这些依赖:

npminstall babel-core babel-loader css-loader file-loader postcss postcss-loader\html-loader html-webpack-plugin json-loader style-loader url-loader\webpack@1 webpack-dev-server@1 extract-text-webpack-plugin@1 -D

如果是选择 webpack 2,由于目前 webpack 2 还是 beta 版,因此可以这样安装:

npminstall babel-core babel-loader css-loader file-loader postcss postcss-loader\html-loader html-webpack-plugin json-loader style-loader url-loader\webpack@beta webpack-dev-server@beta extract-text-webpack-plugin@beta -D

开始写最简单的配置

基础的依赖安装完了,下面我们尝试下写一个最简单的配置,感受下 cooking 的用法。首先创建一个配置文件,命名叫做 cooking.conf.js,然后用你喜欢的编辑器打开。写下如下内容。

// 引入 cooking 依赖
var cooking = require('cooking');// 调用 set 方法传入自定义配置
cooking.set({entry: './src/index.js', // 指定入口文件dist: './dist', // 设置打包后的文件目录hash: true, // 打包的文件是否带 hashsourceMap: true // 是否带 sourceMap
});// 生成 webpack 配置并导出
module.exports = cooking.resolve();

新建并配置一下 babel 的配置文件 —— .babelrc,并且执行 npminstall babel-preset-es2015 -D 安装 preset-es2015。

{"presets": ["es2015"],"comments": false
}

然后创建一个 src/index.js 的入口文件,并随便写一些 ES2015 的代码,所以目前的目录结构为:

my-vue\src\index.jscooking.conf.js.babelrcpackage.json

为了方便调用 cooking 的命令行,我们在 package.json 里配置一条 cooking 的 script。

{"scripts": {"cooking": "cooking"}
}

运行一下 cooking build。其中 -p 表示启动进度条。

npm run cooking build -- -p

最终,我们会得到一个 dist 目录,里面有一个压缩过的 app.[hash].js 文件。那么,如果换做传统 webpack 配置要如何写呢?

var webpack = require('webpack');module.export = {devtool: '#source-map',entry: './src/index.js',output: {path: './dist',filename: '[name].[hash:7].js'},module: {loaders: [{test: /\.(jsx?|babel|es6)$/,include: process.cwd(),exclude: /node_modules|bower_components/,loaders: ['babel-loader']}]},plugins: [new webpack.NoErrorsPlugin(),new webpack.optimize.UglifyJsPlugin({compress: {warnings: false},output: {comments: false},sourceMap: true})]
}

看到这里我们就明白了,cooking 能帮我们省去许多我们可以不用关心的可标准化的配置项,最终只需要简单的几行配置就完成同样的事情。

最基础的 Vue 项目的配置

有了前面的介绍,下面我们来写一份简单的 Vue 项目的配置。当然首先,你要安装一下 vue。

npm i vue@next -S

接下来我们在 src/index.js 文件里写下创建一个 Vue 实例的代码。

import Vue from 'vue'
import App from './app'new Vue({el: '#app',render: h => h(App)
})

然后创建 src/App.vue 文件。

<template><div><h1>Hello, {{ message }}</h1></div>
</template><script>
export default {data() {return {message: 'cooking'}}
}
</script><style lang="css" scoped>h1 {color: red;}
</style>

接着在根目录下创建一个 HTML 模板文件,命名为 index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body><div id="app"></div>
</body>
</html>

现在,我们需要搭建一个支持热替换、能处理 CSS 和 Vue 文件,并且能自动将打包的文件应用在 HTML 模板上的开发环境,来看看需要哪些配置。回到 cooking.conf.js 文件。

var cooking = require('cooking');cooking.set({entry: './src/index.js',dist: './dist',hash: true,sourceMap: true,template: './index.html', // 加载 index.html 模板devServer: { // 开启 webpack-dev-serverport: 8888, // 端口为 8888publicPath: '/' // 开启 dev-server 时默认打包的资源文件路径是和 index.html 同级的},extends: ['vue2'] // 加载 cooking-vue2,自动配置 Vue 2.0 相关内容
});module.exports = cooking.resolve();

只多了三行配置,当然内部做了很多事情。其中 cooking-vue2 是需要你单独安装的,执行下 npminstall cooking-vue2 -D 即可。如果你不安装会有错误提示。这时候我们开启动开发模式。

npm run cooking watch
# 打开 http://localhost:8888 访问

至此,一个简单的开发环境搭建完成。
图片描述

增加 CSS 预处理

无论你倾向 Sass、Less 还是 PostCSS,都能很方便的配置。前两者直接在 extends 配置后安装对应的插件即可,例如配置 Sass,之后执行 npminstall cooking-sass -D

{extends: ['vue2', 'sass']
}

如果是用 PostCSS,只需将配置项配置到 postcss 属性上即可,接受数组和函数类型

{postcss: [require('postcss-salad')]
}

最后按照个人喜好更改配置

如果想提取 CSS 成单独的文件,或者要将公用文件提取出来(CommonChunk),亦或者想加入 eslint,在 cooking 里也是很简单就可做到,我们来大致补充一下,完成最终配置文件。

var cooking = require('cooking');cooking.set({entry: {app: './src/index.js',vendor: ['vue']},dist: './dist',clear: true, // 每次打包都清理掉 dist 目录hash: true,sourceMap: true,template: './index.html',devServer: { port: 8888, publicPath: '/' },postcss: [require('postcss-salad')],extractCSS: true, // 提取 CSS 文件chunk: ['vendor', // entry 里定义的入口文件,也就是会将 vue 单独打包'manifest' // 这个并没有在 entry 里声明的会将所有公用部分打包,也就是 webpack runtime],publicPath: '/dist/', // 打包后的资源文件相对于 url 的路径extends: ['vue2', 'lint'] // 安装 cooking-lint 并配置 '.eslintrc' 文件
});module.exports = cooking.resolve();

最后改一下 package.json 里的 scripts,方便调用。

"scripts": {"dev": "cooking watch","dist": "cooking build -p"
}

结尾

至此,一个简单优雅的 Vue 项目开发环境就搭建完成了。不过,其实还不够好,为什么我们要手动创建项目?为什么要去手动安装这么多依赖?为什么每个项目都要安装一对同样的依赖?那么我们将会在下一篇文章教你用 cooking-cli 来进一步提升开发体验,今天就这。

这个项目的源码我会放到 Github 上。

  • cooking-demo/simple

  • cooking

  • cooking 文档

  • npminstall

相关文章:

【算法导论】【ACM】归并排序总结

许多有用的算法在结构上是递归的&#xff1a;为了解决一个给定的问题&#xff0c;算法一次或多次递归地调用其自身以解决紧密相关地若干子问题。这些算法典型的遵循分治法地思想&#xff1a;将原问题分解成几个规模较小但类似于原问题的子问题&#xff0c;递归地求解这些子问题…

C++ 纯虚方法

1、纯虚方法解决什么样的问题&#xff0c;为什么要设计出纯虚方法&#xff1f; 考虑下面的需求&#xff0c;基类声明了一个方法&#xff0c;这个方法只针对具体的子类才有意义&#xff0c;比如Animal的Eat()方法&#xff0c;调用Animal的Eat方法是没有意义的。比如Dog吃肉&…

C++标准库中各种排序归纳

一、简介所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。我们在编程过程中会经常接触到排序&#xff0c;比如游戏中的排行榜等。C标准库中提供了各种不同的排序算法&#xff0c;这篇博客将逐一介绍。…

【数据结构】最小生成树 Prim算法 Kruskal算法

最小生成树应用场景&#xff1a; 假设以下场景&#xff0c;有一块木板&#xff0c;板上钉上一些钉子&#xff0c;这些钉子可以由一些细绳连接起来。假设每个钉子可以通过一根或者多根细绳连接起来&#xff0c;那么一定存在这样得情况&#xff0c;即用最少的细绳把所有的钉子连…

.net内存回收与Dispose﹐Close﹐Finalize方法

.net内存回收与Dispose﹐Close﹐Finalize方法 一. net的对象使用一般分为三种情况﹕ 1.创建对象2.使用对象3.释放对象 二.创建对象1.创建对象实际分为两个步骤﹕变量类型宣告和初始化对象 2.变量类型宣告(declare),如﹕ FileStream fs这行代码会在当前的变量作用域空间(栈或堆)…

SLAM学习--------相机位姿表示-李群李代数

slam 求解相机的位姿求解核心思想&#xff1a;将有约束的李群问题转换成无约束的李代数问题&#xff0c;然后使用高斯牛顿算法或者LM(列文伯格-马夸尔特法)求解。 人们找了很多以相机位姿为变量的误差函数&#xff0c;比如光度误差&#xff0c;重投影误差&#xff0c;3D几何误…

【ACM】杭电OJ 2063

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2063 借鉴&#xff1a;http://blog.sina.com.cn/s/blog_ac5ed4f30101ewjk.html 二分图&#xff08;二部图&#xff09;&#xff1a;图论中的一种特殊模型。设G(V,E)是一个无向图&#xff0c;如果顶点V可以分割…

AngularJs表单自动验证

angular-auto-validate 地址&#xff1a;https://github.com/jonsamwell/angular-auto-validate 引用&#xff1a; <script src"/Assets/JS/AngularJS/angular-auto-validate/dist/jcs-auto-validate.js" charset"utf-8"></script> 依赖&#…

AlwaysVisibleControlExtender

今天早上学习了AlwaysVisibleControlExtender控件&#xff0c;感觉还是不错。下午就写点东西&#xff0c;总结一下使用方法。 简单使用示例(显示当前时间) 1&#xff09;在VS下&#xff0c;新建一个ASP.NET AJAX-Enabled Web Project项目&#xff0c;命名为AlwaysVisibleC…

Depth graph

深度相机 定义&#xff1a;可以直接获取场景中物体距离摄像头物理距离的相机。在计算机视觉系统中&#xff0c;三维场景信息为图像分割、目标检测、物体跟踪等各类计算机视觉应用提供了更多的可能性&#xff0c;而深度图像&#xff08;Depth map&#xff09;作为一种普遍的三维…

【ACM】POJ 1852

【问题描述】 一队蚂蚁在一根水平杆上行走&#xff0c;每只蚂蚁固定速度 1cm/s. 当一只蚂蚁走到杆的尽头时&#xff0c;立即从秆上掉落. 当两只蚂蚁相遇时它们会掉头向相反的方向前进. 我们知道每只蚂蚁在杆上的初始位置, 但是, 我们不知道蚂蚁向哪个方向前行. 你的任务是计算…

ZStack--通过Ansible实现全自动化

2019独角兽企业重金招聘Python工程师标准>>> Agent是一种常见的IaaS软件管理设备的方式&#xff1b;例如&#xff0c;ZStack使用Python agents去管理KVM主机。因为海量的设备&#xff0c;安装和升级agents成为巨大的挑战&#xff0c;所以大多数IaaS软件把这个问题留…

SVO 半直接视觉里程计

SVO 从名字来看&#xff0c;是半直接视觉里程计&#xff0c;所谓半直接是指通过对图像中的特征点图像块进行直接匹配来获取相机位姿&#xff0c;而不像直接匹配法那样对整个图像使用直接匹配。整幅图像的直接匹配法常见于RGBD传感器&#xff0c;因为RGBD传感器能获取整幅图像的…

css构造文本

1. 1. 文本缩进text-indent&#xff1a;值&#xff1b;值为数字&#xff0c;最常用的数值单位是px(像素)&#xff0c;也可以直接是百分比&#xff01;text-indent:100px;text-indent:10%;2. 文本对齐text-align:对其方式;可以的值为&#xff1a;left、center、right3. 文本行高…

【数据结构】单链表的逆序输出(两种方法)

第一种方法&#xff1a;转换指针方向 即&#xff1a;将一个已经创建好的单链表进行指针域的改变 今天突然被问到单链表逆序的问题&#xff0c;弄了好久才看出别人的程序有啥问题&#xff0c;就重新写了一遍。 今天才在CSDN客户端上看到美团的面试题是冒泡排序。 一个看似简单…

koa+mongoose基础入门

1.mongoose基本使用 1.安装mongodb npm install mongodb 2.引入mongodb数据表&#xff0c;连接mongodb&#xff0c;通过node来对mongodb进行异步的增删改查 const mongodb requrie(mongodb); mongodb.MongoClient.connect("mongodb://localhost/db1", function(err,…

视觉SLAM学习(三)--------SLAM 综述

SLAM概述 参考资料分享来自本人博客&#xff1a;https://blog.csdn.net/Darlingqiang/article/details/78840931 SLAM一般处理流程包括track和map两部分。所谓的track是用来估计相机的位姿&#xff0c;也叫front-end。而map部分(back-end)则是深度的构建&#xff0c;通过前面…

【数据结构】所有顶点对的最短路径 Floyd算法

所有顶点对的最短路径问题是指&#xff1a;对于给定的有向图G(V&#xff0c;E),求任意一对顶点之间的最短路径。 可以求解得到的 的递推公式&#xff1a; #include <stdio.h> #include <stdlib.h> const int FINITY 5000; const int M 20; typedef struct {ch…

backbone学习总结(二)

今天来看下backbone的路由控制的功能。其实个人感觉backbone&#xff0c;模块就那么几个&#xff0c;熟悉它的框架结构&#xff0c;以及组成&#xff0c;就差不多。 废话不多说&#xff0c;我们来看看还剩下的功能。 关于路由和历史管理 通过 Backbone.Router.extend 来创建路由…

人工智能--野人过河

课程简介 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能的定义可以分为两部分&#xff0c;即“人工”和“智能”。“人工”比较好…

java对cookie的操作

原文&#xff1a;http://www.cnblogs.com/muzongyan/archive/2010/08/30/1812552.html java对cookie的操作比较简单&#xff0c;主要介绍下建立cookie和读取cookie&#xff0c;以及如何设定cookie的生命周期和cookie的路径问题。 建立一个无生命周期的cookie&#xff0c;即随着…

【ACM】POJ 3069

【问题描述】 Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep track of his forces, Saruman distributes seeing stones, known as palantirs, among the troops. Each palantir has a maximum effective range of R u…

sparkCore源码解析之思维脑图

2019独角兽企业重金招聘Python工程师标准>>> 在学习sparkCore时&#xff0c;有几个模块的概念理解不是很透彻&#xff0c;故对照源码进行学习&#xff0c;并将结果一脑图的形式呈现&#xff0c;方便后续的持续学习。 详细内容见&#xff1a; sparkCore源码解析之blo…

pangilin 安装编译

make pangolin 的时候报错 ootsun:/home/sun/AR/orb/Pangolin-0.5/build# make [ 1%] Building CXX object src/CMakeFiles/pangolin.dir/log/packetstream.cpp.o /home/sun/AR/orb/Pangolin-0.5/src/log/packetstream.cpp: 在函数‘void pangolin::WaitUntilPlaybackTim…

PHP实现求阶乘

function factorial ($x){if ($x > 1) {$s $x * factorial ($x - 1);} else {$s $x;}return $s; }$x 100;echo $x."的阶乘的为".factorial($x);转载于:https://blog.51cto.com/chensenlin/1854679

【ACM】杭电OJ 2064(汉诺塔III)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2064 思路&#xff1a; 1、将n-1个盘从A移到C f(n-1)次 2、将第n个从A移到B 1次 3、将n-1个盘从C移到A f(n-1)次 4、将第n个从B移到C 1次 5、将n-1个盘从A移到C f(n-1)次 #include<cstdio> #inclu…

文件上传至阿里云

public static String uploadFile2OSS(InputStream instream, String fileName) throws IOException {String imageName null;OSSClient ossClient null;try {ClientConfiguration conf new ClientConfiguration();// 请求超时时间设置conf.setConnectionTimeout(5000);// 请…

ORB-SLAM2安装

安装顺利与否可能会与Ubuntu版本有关。&#xff08;ubuntu16.04 gcc4.8.5这个很重要偶&#xff0c;本班的直接决定Pangolin能不能安装成功&#xff0c;如果遇到哦问题的朋友可以参考一下链接 http://blog.csdn.net/Darlingqiang/article/details/78928873&#xff09;亲测可用…

iOS 系统分析(一) 阅读内核准备知识

原文出自【听云技术博客】&#xff1a;http://blog.tingyun.com/web/a... 0x01 iOS体系架构1.1 iOS 系统的整体体系架构 用户体验( The User Experience layer )&#xff1a;SpringBoard 同时支持 Spotlight。 应用软件开发框架&#xff08;The Application Frameworks layer&a…

【数据结构】拓扑排序

如果一个有向图中没有包含简单的回路&#xff0c;这样的图为有向无环图。 图中的顶点代表事件&#xff08;活动&#xff09;&#xff0c;图中的有向边说明了事件之间的先后关系。这种用顶点表示活动&#xff0c;用弧表示活动时间的优先关系的有向图称为顶点表示活动的网&#…