你也许不知道的Vuejs - 工欲善其事必先利其器

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 还有不少相似的工具,他们各有各的优势,好比:rollupparcel...。webpack

从此文章全部的实例将用到 webpack3.x 版本工具来结合Vue 完成开发工做。git

初始 webpack

这里不得不说一下,不少朋友在开发 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 的强大。

实时从新加载(live reloading)

上面的例子还有个问题,就是每次咱们更新了代码,就须要从新进行打包编译,并手动刷新浏览器,才能看到咱们更改的效果,实在是太麻烦了。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.jsmsg 内容,浏览器的内容也会跟着变化,是否是很酷,赶忙动手试试吧。

使用 npm 脚本

针对上面的打包命令 ./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 已经足够强大,可是在程序员眼里,它一直是个很麻烦的东西,它没有变量,也没有条件语句,只是单纯的一行行的描述,写起来至关麻烦。因而各类 CSS预处理器 应运而生,其中我最喜欢的是 SASS,使用 sass 语法编写咱们的样式文件,会大大提升咱们的开发效率,使得 css 工程化变得容易了不少。

接下来介绍下,如何集成到咱们的项目中。

对于 webpack 来讲 一切皆模块,全部的文件经过模块引入的方式造成依赖关系,而对于每一个模块的引入或预处理,都是经过 loader 来实现了。由于咱们的 sass 语法浏览器是没法识别的,因此在引入时须要使用相关 loader 对其进项预处理,转化为相应的 css。虽然 css 浏览器能够识别的,可是 webpack 本质上是一个 javascript 应用程序的静态模块打包器,一切文件内容都将处理为 javascript,而后进行后期的处理。因此这里除了须要预处理 sassloader,还须要加载 cssloader,最后还须要经过 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.htmlhead 标签中新增了一个 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 的使用技巧,在实际开发中,咱们才会更加的驾轻就熟。不至于被一个莫名其妙的错误个吓到。程序员有三宝:多学习,多编写,多总结,咱们的编程技巧才能才会不断提升。

源码在此

专题目录

You-May-Not-Know-Vuejs

相关文章
相关标签/搜索