by yugasun from yugasun.com/post/you-ma… 本文可全文转载,但须要保留原做者和出处。javascript
既然是实战,怎离不开项目开发的环境呢?先给你们推荐下个人我的开发环境:css
硬件设备:Mac OSX 编译器:Visual Studio Code 命令行工具:iTerm2 调试工具:Chrome Dev tool + vue-devtools 版本管理:Githtml
具体工具的操做界面和如何使用,这里就不展现了。随便用搜索引擎搜索,就是相关介绍。你们能够根据我的喜爱,来选择适合你的开发环境。vue
前面的文章中使用 Vue,都是直接引入源码方式来使用,可是实际开发中项目通常很复杂,而且会涉及到不少页面模板,不可能全部的功能咱们都写在同一个js文件,而后在经过 script 标签引入,这样项目大了会愈来愈不易维护,因此项目须要模块化开发。java
关于什么事模块化,具体如何模块化构架咱们的项目,推荐阅读 JavaScript 模块化入门Ⅰ:理解模块 和 JavaScript 模块化入门Ⅱ:模块打包构建。node
当项目代码多了,咱们的模块文件愈来愈多,就须要工具来帮助咱们更好的管理和打包这些模块,让咱们能更好的关注模块化开发,而不是这些琐碎的事情。因而 webpack
相似的工具就应运而生,固然除了 webpack
还有不少相似的工具,他们各有各的优势,好比:rollup、parcel...。webpack
从此文章全部的实例将用到 webpack
的 3.x
版本工具来结合Vue 完成开发工做。git
这里不得不说一下,不少朋友在开发 Vue 项目的时候,一上来就使用 vue-cli 脚手架工具开发项目,虽然能够很快的构建项目模板,不用关注初始化配置问题。可是我不建议这么作,由于一上来就是 vuejs + webpack + es6 + babel + eslint...
等各类工具,有人都还不知道他们是什么,就开始用。出了问题,就不知道如何是好。虽然借助搜索引擎能够帮助咱们解决80%的难题,但仍是须要花费大量的精力去搜索查询,不断的尝试,等问题解决了,一天就过去了,得不偿失啊。程序员
因此我建议先从学会使用 webpack
开始,一步一步的引入进来,会容易接受一些。毕竟这世界上大多数人都不是天才,要学会跑,得先学会走路。es6
虽然当前社会比较浮躁,可是拥有一颗宁静的心,脚踏实地,才是成功之道啊~
好了废话很少说,直接进入今天的正题,使用 webpack 愉快的进行 Vuejs 项目开发。
在阅读下面代码以前,请提早熟悉 nodejs 模块的使用,包括基本的经过 npm 安装模块依赖和如何引入第三方模块使用,这里虽然会提到,但不会详细解释。
咱们先新建一个项目文件夹,在根目录下新建 index.html
,代码以下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue webpack demo</title>
</head>
<body>
<div id="app"></div>
<script src="./build.js"></script>
</body>
</html>
复制代码
命令行运行 npm init
,按照交互提示,填写项目相关信息(固然都是英文,不懂得直接翻一下就明白了),填写完成后,项目根目录下会出现 package.json
文件(关于package.json文件内容具体介绍,能够阅读这篇文章:package.json文件)。而后经过 npm
安装咱们须要的 vue
库:
# 添加 --save 参数,会将 vue 依赖添加到 package.json 文件中
npm install vue --save
复制代码
而后新建一个 src
目录,在 src
目录下建立一个 app.js
入口文件,代码以下:
// 模块化的引入 vue,并将其赋值给 Vue 变量
var Vue = require('vue')
new Vue({
el: "#app",
template: "<h1>{{ msg }}</h1>",
data () {
return {
msg: 'Hello Vue.js'
}
}
})
复制代码
固然 require
函数浏览器是没法识别的,这是就须要经过 webpack
帮咱们实现编译打包工做,转化为主流浏览器但是别的 ES5 代码。
先安装 webpack
包依赖:
# 添加 --save-dev 参数,会将 webpack 开发依赖添加到 package.json 文件中
npm install webpack --save-dev
复制代码
而后在项目根目录下建立 webpack.config.js
文件,代码以下:
module.exports = {
// 入口文件
entry: './src/app.js',
// 编译输出文件
output: {
filename: 'build.js'
},
resolve: {
alias: {
// 由于咱们这里用的是 require 引入方式,因此应该使用vue.common.js/vue.js/vue.min.js
'vue$': 'vue/dist/vue.common.js'
}
}
}
复制代码
由于上面的 index.html
中引入的是编译后的 build.js
文件,要看到开发效果,就须要手动运行 webpack
打包命令:
./node_modules/.bin/webpack
复制代码
这里若是你想直接运行
webpack
,那么就须要你的电脑全局安装 webpack,能够经过运行npm install webpack -g
命令来全局安装。
而后你会看到输出如下结果:
$ webpack
Hash: 8a61c2605578f38f46cd
Version: webpack 3.10.0
Time: 386ms
Asset Size Chunks Chunk Names
build.js 104 kB 0 [emitted] main
[0] (webpack)/buildin/global.js 509 bytes {0} [built]
[1] ./src/app.js 148 bytes {0} [built]
+ 4 hidden modules
复制代码
此时根目录下就会出现 build.js
文件,咱们再经过浏览器打开 index.html
文件,熟悉的画面出现了,Hello Vue.js
。
到这里一个简单的基于 vue + webpack
的项目就构建完成了,是否是很简单,火烧眉毛想本身动手试试呢?固然 webpack
的功能远不止如此更详细的功能,请阅读 官方文档,全面的了解下 webpack
的强大。
上面的例子还有个问题,就是每次咱们更新了代码,就须要从新进行打包编译,并手动刷新浏览器,才能看到咱们更改的效果,实在是太麻烦了。webpack 做者也考虑到了这个问题,因而同时开发了 webpack-dev-server
工具,来帮助咱们实现 live reloading
的功能,也就是当咱们更新代码时,浏览器会实时刷新,呈现更新后的效果。
赶忙用起来~ 先安装下依赖:
npm install webpack-dev-server --save-dev
复制代码
而后修改 webpack.config.js
配置文件以下:
module.exports = {
// 入口文件
entry: './src/app.js',
// 编译输出文件
output: {
filename: 'build.js'
},
resolve: {
alias: {
// 由于咱们这里用的是 require 引入方式,因此应该使用vue.common.js/vue.js/vue.min.js
'vue$': 'vue/dist/vue.common.js'
}
},
// 这里添加的是有关 webpack-dev-server 的配置
devServer: {
// 这里定义 webpack-dev-server 开启的web服务的根目录
contentBase: './'
}
}
复制代码
而后执行命令:
./node_modules/.bin/webpack-dev-server
复制代码
控制台会输出一下内容:
$ ./node_modules/.bin/webpack-dev-server
Project is running at http://localhost:8080/
webpack output is served from /
Content not from webpack is served from ./
Hash: d33155f6797f2c78c448
Version: webpack 3.10.0
Time: 903ms
Asset Size Chunks Chunk Names
build.js 627 kB 0 [emitted] [big] main
[0] (webpack)/buildin/global.js 509 bytes {0} [built]
[3] multi (webpack)-dev-server/client?http://localhost:8080 ./src/app.js 40 bytes {0} [built]
[4] (webpack)-dev-server/client?http://localhost:8080 7.91 kB {0} [built]
...
[28] ./node_modules/timers-browserify/main.js 1.9 kB {0} [built]
+ 15 hidden modules
webpack: Compiled successfully.
复制代码
打开浏览器,访问: http://localhost:8080,此时咱们熟悉的画面又出现了,O(∩_∩)O~~。咱们再尝试修改 app.js
中 msg
内容,浏览器的内容也会跟着变化,是否是很酷,赶忙动手试试吧。
针对上面的打包命令 ./node_modules/.bin/webpack
和实时开发命令 ./node_modules/.bin/webpack-dev-server
,虽然你能够很快的在命令行复制粘贴输入,可是第一次仍是免不了动手输入。做为一个懒惰的程序员,怎么能接受敲击这么多多余的字符呢?正好package.json
文件中 scripts
字段就能够帮助咱们解决这个烦恼。
先来看下介绍:
scripts 是用来指定运行脚本命令的npm命令行缩写的,好比 start 指定了运行
npm run start
时,所要执行的相关命令。
好的,既然明白了它的做用,咱们就来尝试改写 package.json
文件,修改 scripts
字段为以下内容:
"scripts": {
"dev": "webpack-dev-server",
"build": "webpack"
}
复制代码
而后,在命令行输入:
npm run dev
复制代码
你会发现跟执行 ./node_modules/.bin/webpack-dev-server
是同样的效果。
注意:这里在
scripts
中指定webpack-dev-server
命令是,省去了命令路径,这是由于,npm 在执行脚本时,会默认优先执行当前目录下./node_modules/.bin/
中的命令,若是找不到该命令,则会执行全局命令。
同理,执行 npm run build
就是打包输出咱们想要的 build.js
文件。
虽然 css 已经足够强大,可是在程序员眼里,它一直是个很麻烦的东西,它没有变量,也没有条件语句,只是单纯的一行行的描述,写起来至关麻烦。因而各类 CSS预处理器 应运而生,其中我最喜欢的是 SASS,使用 sass 语法编写咱们的样式文件,会大大提升咱们的开发效率,使得 css 工程化变得容易了不少。
接下来介绍下,如何集成到咱们的项目中。
对于 webpack 来讲 一切皆模块
,全部的文件经过模块引入的方式造成依赖关系,而对于每一个模块的引入或预处理,都是经过 loader
来实现了。由于咱们的 sass
语法浏览器是没法识别的,因此在引入时须要使用相关 loader
对其进项预处理,转化为相应的 css
。虽然 css 浏览器能够识别的,可是 webpack
本质上是一个 javascript 应用程序的静态模块打包器,一切文件内容都将处理为 javascript,而后进行后期的处理。因此这里除了须要预处理 sass
的 loader
,还须要加载 css
的 loader
,最后还须要经过 style-loader
来转化为经过 js 的方式动态建立 style
标签到 index.html
中。
知道了这点,咱们就知道要怎么作了,首先安装所需的 loader
:
# 由于 `sass-loader` 须要依赖 `node-sass`, 因此这里一并安装
npm install style-loader css-loader sass-loader node-sass --save-dev
复制代码
修改 webpack.config.js
配置文件,添加相关 loader
配置:
module.exports = {
//...
module: {
// 这里用来配置处理不一样后缀文件所使用的loader
rules: [
{
test: /\.scss$/,
use: [
{
loader: 'style-loader'
},
{
loader: 'css-loader'
},
{
loader: 'sass-loader'
}
]
}
]
}
}
复制代码
webpack 的 loader 是支持链式传递的,它可以对资源使用流水线(pipline)式处理,一组链式的 loader 将按照相反顺序依次处理,这里的处理流程就是: sass-loader -> css-loader => style-loader
配置好了,咱们如今来测试下,在 src
目录下建立一个 app.scss
文件,内容以下:
$red: rgb(218, 42, 42);
h1 {
color: $red;
}
复制代码
而后在 src/app.js
文件中引入:
require('./app.scss');
var Vue = require('vue');
new Vue({
el: "#app",
template: "<h1>{{ msg }}</h1>",
data () {
return {
msg: 'Hello Vue.js'
}
}
});
复制代码
此时再运行 npm run dev
,你会发现咱们的 h1
标签颜色变了。经过审核元素,能够发现 index.html
的 head
标签中新增了一个 style
标签,内容就是,app.scss
编译输出的内容:
h1 {
color: #da2a2a;
}
复制代码
若是还不清楚 sass
用法的,建议去看看这篇基础介绍文档:SASS用法指南
既然说到了 css 静态资源,天然免不了对于图片的加载了。上文说过,在 webpack 中,一切皆模块,图片固然也是以模块的方式引入的。既然是模块,天然少不了相关引入的 loader,这里图片引入咱们使用到的是 url-loader
,先安装下:
npm install url-loader --save-dev
复制代码
添加 url-loader
配置:
module.exports = {
// ...
module: {
// 这里用来配置处理不一样后缀文件所使用的loader
rules: [
// ...
{
test: /\.(jpe?g|gif|png)$/,
use: 'url-loader'
}
]
}
}
复制代码
而后再 app.js
中引入:
require('./app.scss');
var Vue = require('vue');
var logoSrc = require('./logo.jpg')
new Vue({
el: "#app",
data () {
return {
msg: 'Hello Vue.js'
}
},
render (h) {
return (
h('div', [
h('img', {
domProps: {
src: logoSrc,
alt: 'logo',
className: 'logo'
}
}),
h('h1', this.msg)
])
)
}
});
复制代码
这里咱们用
render
函数来自定义渲染咱们的节点,它含有默认参数h
就是咱们 花式渲染目标元素 讲到的createElement
参数的别名而已,这里为了书写简单。h
函数的第一个参数为dom
名称,第二个参数为建立时配置对象,经过domProps
来添加 DOM 相关的属性值。这里将咱们引入的logoSrc
赋值给它的src
属性。
而后再从新运行 npm run dev
,页面中就出现了咱们想要的 logo
图片了。
知己知彼,百战不殆
,咱们只有真正了解了 webpack
的使用技巧,在实际开发中,咱们才会更加的驾轻就熟。不至于被一个莫名其妙的错误个吓到。程序员有三宝:多学习,多编写,多总结
,咱们的编程技巧才能才会不断提升。