作者:故事我忘了
个人微信公众号:程序猿的月光宝盒

一. webpack

1.1. webpack的loader

  • less文件处理 less-loader/less

    如果我们希望在项目中使用less、scss、stylus来写样式,webpack是否可以帮助我们处理呢?

    ​ 我们这里以less为例,其他也是一样的。

    ​ 我们还是先创建一个less文件,依然放在css文件夹中

    但是报了如下错误

    继续在官方中查找,我们会找到less-loader相关的使用说明

    ​ 首先,还是需要安装对应的loader

    ​ 注意:我们这里还安装了less,因为webpack会使用less对less文件进行编译

    npm install --save-dev less-loader less

    其次,修改对应的配置文件

    ​ 添加一个rules选项,用于处理.less文件

  • url-loader/file-loader

    首先,我们在项目中加入两张图片:

    ​ 一张较小的图片test01.jpg(小于8kb),一张较大的图片test02.jpeg(大于8kb)

    ​ 待会儿我们会针对这两张图片进行不同的处理

    我们先考虑在css样式中引用图片的情况,所以我更改了normal.css中的样式:

    body {
    background-color: red;
    background: url(../imgs/test01.jpeg)
    }

    ​ 如果我们现在直接打包,会出现如下问题

    图片处理,我们使用url-loader来处理,依然先安装url-loader

    npm install --save-dev url-loader

    修改webpack.config.js配置文件:

    再次打包,运行index.html,就会发现我们的背景图片选出了出来。

    ​ 而仔细观察,你会发现背景图是通过base64显示出来的

    ​ OK,这也是limit属性的作用,当图片小于8kb时,对图片进行base64编码

    那么问题来了,如果大于8kb呢?我们将background的图片改成test02.jpg

    ​ 这次因为大于8kb的图片,会通过file-loader进行处理,但是我们的项目中并没有file-loader

    所以,我们需要安装file-loader

    npm install --save-dev file-loader

    再次打包,就会发现dist文件夹下多了一个图片文件

  • babel-loader

我们发现webpack自动帮助我们生成一个非常长的名字

​ 这是一个32位hash值,目的是防止名字重复

​ 但是,真实开发中,我们可能对打包的图片名字有一定的要求

​ 比如,将所有的图片放在一个文件夹中,跟上图片原来的名称,同时也要防止重复

所以,我们可以在options中添加上如下选项:

​ img:文件要打包到的文件夹

​ name:获取图片原来的名字,放在该位置

​ hash:8:为了防止图片名称冲突,依然使用hash,但是我们只保留8位

​ ext:使用图片原来的扩展名

但是,我们发现图片并没有显示出来,这是因为图片使用的路径不正确

​ 默认情况下,webpack会将生成的路径直接返回给使用者

​ 但是,我们整个程序是打包在dist文件夹下的,所以这里我们需要在路径下再添加一个dist/

1.1.1 bable的使用--ES6语法处理

​ 如果你仔细阅读webpack打包的js文件,发现写的ES6语法并没有转成ES5,那么就意味着可能一些对ES6还不支持的浏览器没有办法很好的运行我们的代码。

​ 在前面我们说过,如果希望将ES6的语法转成ES5,那么就需要使用babel。

​ 而在webpack中,我们直接使用babel对应的loader就可以了。

npm install --save-dev babel-loader@7 babel-core babel-preset-es2015

配置webpack.config.js文件

1.2. webpack中配置Vue

后续项目中,我们会使用Vuejs进行开发,而且会以特殊的文件来组织vue的组件。

​ 所以,下面我们来学习一下如何在我们的webpack环境中集成Vuejs

现在,我们希望在项目中使用Vuejs,那么必然需要对其有依赖,所以需要先进行安装

​ 注:因为我们后续是在实际项目中也会使用vue的,所以并不是开发时依赖

npm install vue --save

那么,接下来就可以按照我们之前学习的方式来使用Vue了

修改完成后,重新打包,运行程序:

​ 打包过程没有任何错误(因为只是多打包了一个vue的js文件而已)

​ 但是运行程序,没有出现想要的效果,而且浏览器中有报错

这个错误说的是我们使用的是runtime-only版本的Vue,什么意思呢?

​ 这里我只说解决方案:Vue不同版本构建,后续我具体讲解runtime-only和runtime-compiler的区别。

所以我们修改webpack的配置,添加如下内容即可

1.2.1 el和template的区别

正常运行之后,我们来考虑另外一个问题:

​ 如果我们希望将data中的数据显示在界面中,就必须是修改index.html

​ 如果我们后面自定义了组件,也必须修改index.html来使用组件

​ 但是html模板在之后的开发中,我并不希望手动的来频繁修改,是否可以做到呢?

定义template属性:

​ 在前面的Vue实例中,我们定义了el属性,用于和index.html中的#app进行绑定,让Vue实例之后可以管理它其中的内容

​ 这里,我们可以将div元素中的{{message}}内容删掉,只保留一个基本的id为div的元素

​ 但是如果我依然希望在其中显示{{message}}的内容,应该怎么处理呢?

​ 我们可以再定义一个template属性,代码如下:

重新打包,运行程序,显示一样的结果和HTML代码结构

那么,el和template模板的关系是什么呢?

​ 在我们之前的学习中,我们知道el用于指定Vue要管理的DOM,可以帮助解析其中的指令、事件监听等等。

​ 而如果Vue实例中同时指定了template,那么template模板的内容会替换掉挂载的对应el的模板。

这样做有什么好处呢?

​ 这样做之后我们就不需要在以后的开发中再次操作index.html,只需要在template中写入对应的标签即可

但是,书写template模块非常麻烦怎么办呢?

​ 没有关系,稍后我们会将template模板中的内容进行抽离。

​ 会分成三部分书写:template、script、style,结构变得非常清晰。

1.2.2 Vue组件化开发引入

在学习组件化开发的时候,以后的Vue开发过程中,我们都会采用组件化开发的思想。

​ 那么,在当前项目中,如果我也想采用组件化的形式进行开发,应该怎么做呢?

查看下面的代码:

​ 当然,我们也可以将下面的代码抽取到一个js文件中,并且导出。

1.2.3 . vue 文件封装处理

但是一个组件以一个js对象的形式进行组织和使用的时候是非常不方便的

​ p一方面编写template模块非常的麻烦

​ 另外一方面如果有样式的话,我们写在哪里比较合适呢?

现在,我们以一种全新的方式来组织一个vue的组件

但是,这个时候这个文件可以被正确的加载吗?

​ 必然不可以,这种特殊的文件以及特殊的格式,必须有人帮助我们处理。

​ 谁来处理呢?vue-loader以及vue-template-compiler。

安装vue-loader和vue-template-compiler

npm install vue-loader vue-template-compiler --save-dev

修改webpack.config.js的配置文件:


1.3. webpack的plugin

plugin是什么?

​ plugin是插件的意思,通常是用于对某个现有的架构进行扩展。

​ webpack中的插件,就是对webpack现有功能的各种扩展,比如打包优化,文件压缩等等。

loader和plugin区别

​ loader主要用于转换某些类型的模块,它是一个转换器。

​ plugin是插件,它是对webpack本身的扩展,是一个扩展器。

plugin的使用过程:

​ 步骤一:通过npm安装需要使用的plugins(某些webpack已经内置的插件不需要安装)

​ 步骤二:在webpack.config.js中的plugins中配置插件。

下面,我们就来看看可以通过哪些插件对现有的webpack打包过程进行扩容,让我们的webpack变得更加好用。

1.3.1 添加版权的plugin

我们先来使用一个最简单的插件,为打包的文件添加版权声明

​ 该插件名字叫BannerPlugin,属于webpack自带的插件。

按照下面的方式来修改webpack.config.js的文件:

重新打包程序:查看bundle.js文件的头部,看到如下信息

1.3.2 打包html的plugin

目前,我们的index.html文件是存放在项目的根目录下的。

​ 我们知道,在真实发布项目时,发布的是dist文件夹中的内容,但是dist文件夹中如果没有index.html文件,那么打包的js等文件也就没有意义了。

​ 所以,我们需要将index.html文件打包到dist文件夹中,这个时候就可以使用HtmlWebpackPlugin插件

HtmlWebpackPlugin插件可以为我们做这些事情:

​ 自动生成一个``index.html`文件(可以指定模板来生成)

​ 将打包的js文件,自动通过script标签插入到body中

安装HtmlWebpackPlugin插件

npm install html-webpack-plugin --save-dev

使用插件,修改webpack.config.js文件中plugins部分的内容如下:

​ 这里的template表示根据什么模板来生成index.html

​ 另外,我们需要删除之前在output中添加的publicPath属性

​ 否则插入的script标签中的src可能会有问题

1.3.3 js 压缩的 Plugin

在项目发布之前,我们必然需要对js等文件进行压缩处理

​ 这里,我们就对打包的js文件进行压缩

​ 我们使用一个第三方的插件uglifyjs-webpack-plugin,并且版本号指定1.1.1,和CLI2保持一致

npm install uglifyjs-webpack-plugin@1.1.1 --save-dev

修改webpack.config.js文件,使用插件:

查看打包后的bunlde.js文件,是已经被压缩过了。

1.4. 搭建本地服务器

  • webpack-dev-server

webpack提供了一个可选的本地开发服务器,这个本地服务器基于node.js搭建,内部使用express框架,可以实现我们想要的让浏览器自动刷新显示我们修改后的结果。

不过它是一个单独的模块,在webpack中使用之前需要先安装它

npm install --save-dev webpack-dev-server@2.9.1

devserver也是作为webpack中的一个选项,选项本身可以设置如下属性:

contentBase:为哪一个文件夹提供本地服务,默认是根文件夹,我们这里要填写./dist

port:端口号

inline:页面实时刷新

historyApiFallback:在SPA页面中,依赖HTML5的history模式

webpack.config.js文件配置修改如下:

我们可以再配置另外一个scripts:

​ --open参数表示直接打开浏览器

四. Vue CLI

4.1. 什么是CLI

如果你只是简单写几个Vue的Demo程序, 那么你不需要Vue CLI.

如果你在开发大型项目, 那么你需要, 并且必然需要使用Vue CLI

​ 使用Vue.js开发大型应用时,我们需要考虑代码目录结构、项目结构和部署、热加载、代码单元测试等事情。

​ 如果每个项目都要手动完成这些工作,那无疑效率比较低效,所以通常我们会使用一些脚手架工具来帮助完成这些事情。

CLI是什么意思?**

​ CLI是Command-Line Interface, 翻译为命令行界面, 但是俗称脚手架.

Vue CLI是一个官方发布 vue.js 项目脚手架

​ 使用 vue-cli 可以快速搭建Vue开发环境以及对应的webpack配置.

4.1.2 Vue CLI使用前提-Node

安装 NodeJS

​ 可以直接在官方网站中下载安装.

​ 网址: http://nodejs.cn/download/

检测安装的版本

​ 默认情况下自动安装Node和NPM

​ Node环境要求8.9以上或者更高版本

什么是 NPM 呢 ?

​ NPM的全称是Node Package Manager

​ 是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。

​ 后续我们会经常使用NPM来安装一些开发过程中依赖包.

cnpm安装

由于国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。

你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

npm install -g cnpm --registry=https://registry.npm.taobao.org

这样就可以使用 cnpm 命令来安装模块了:

cnpm install [name]

4.1.3 Vue CLI 使用前提 - Webpack

Vue.js官方脚手架工具就使用了webpack模板

​ 对所有的资源会压缩等优化操作

​ 它在开发过程中提供了一套完整的功能,能够使得我们开发过程中变得高效。

Webpack的全局安装

npm install webpack -g

安装Vue脚手架

npm install -g @vue/cli

注意:上面安装的是Vue CLI3的版本,如果需要想按照Vue CLI2的方式初始化项目时不可以的。

Vue CLI2初始化项目

vue init webpack my-project

Vue CLI3初始化项目

vue create my-project

4.2. CLI2初始化项目的过程

4.3. CLI2生产的目录结构的解析

4.4 Runtime-Compiler和Runtime-only的区别

简单总结

​ 如果在之后的开发中,你依然使用template,就需要选择Runtime-Compiler

​ 如果你之后的开发中,使用的是.vue文件开发,那么可以选择Runtime-only

render和template

Runtime-Compiler 和 Runtime-only

为什么存在这样的差异呢?

​ 我们需要先理解Vue应用程序是如何运行起来的。

​ Vue中的模板如何最终渲染成真实DOM。

​ 我们来看下面的一幅图。

Render函数的使用

执行npm run build

执行npm run dev

Vue 学习笔记 [Part 5]的更多相关文章

  1. Vue学习笔记-2

    前言 本文非vue教程,仅为学习vue过程中的个人理解与笔记,有说的不正确的地方欢迎指正讨论 1.computed计算属性函数中不能使用vm变量 在计算属性的函数中,不能使用Vue构造函数返回的vm变 ...

  2. Vue学习笔记-1

    前言 本文不是Vue.js的教程,只是一边看官网Vue的教程文档一边记录并总结学习过程中遇到的一些问题和思考的笔记. 1.vue和avalon一样,都不支持VM初始时不存在的属性 而在Angular里 ...

  3. vue 学习笔记(二)

    最近公司赶项目,一直也没时间看 vue,之前看下的都快忘得差不多了.哈哈哈,来一起回顾一下vue 学习笔记(一)后,继续向下看嘛. #表单输入绑定 基础用法 v-model 会忽略所有表单元素的 va ...

  4. vue学习笔记之:为何data是一个方法

    vue学习笔记之:为何data是一个方法 在vue开发中,我们可以发现,data中的属性值是在function中return出来的.可为何data必须是一个函数呢?我们先看官方的解释: 当一个组件被定 ...

  5. vue学习笔记(八)组件校验&通信

    前言 在上一章博客的内容中vue学习笔记(七)组件我们初步的认识了组件,并学会了如何定义局部组件和全局组件,上一篇内容仅仅只是对组件一个简单的入门,并没有深入的了解组件当中的其它机制,本篇博客将会带大 ...

  6. vue学习笔记(九)vue-cli中的组件通信

    前言 在上一篇博客vue学习笔记(八)组件校验&通信中,我们学会了vue中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...

  7. vue学习笔记(十)路由

    前言 在上一篇博客vue学习笔记(九)vue-cli中的组件通信内容中,我们学习组件通信的相关内容和进行了一些组件通信的小练习,相信大家已经掌握了vue-cli中的组件通信,而本篇博客将会带你更上一层 ...

  8. AntDesign vue学习笔记(七)Form 读写与图片上传

    AntDesign Form使用布局相比传统Jquery有点繁琐 (一)先读写一个简单的input为例 <a-form :form="form" layout="v ...

  9. Vue学习笔记十三:Vue+Bootstrap+vue-resource从接口获取数据库数据

    目录 前言 SpringBoot提供后端接口 Entity类 JPA操作接口 配置文件 数据库表自动映射,添加数据 写提供数据的接口 跨域问题 前端修改 效果图 待续 前言 Vue学习笔记九的列表案例 ...

  10. vue学习笔记(三)class和style绑定

    前言 通过上一章的学习vue学习笔记(二)vue的生命周期和钩子函数,我们已经更近一步的知道了关于vue的一些知识,本篇博客将进一步探讨vue其它方面的内容,vue中关于class和style绑定,关 ...

随机推荐

  1. ubuntu20.04使用EasyConnect

    起因:BUAA校外访问内网vpn的客户端 用的学校vpn内下载的deb包EasyConnect_x64_7_6_7_3.deb,就直接sudo apt install安装了,之后应用的目录在/usr/ ...

  2. 『Plotly实战指南』--绘图初体验

    今天,打算通过绘制一个简单的散点图,来开启我们 Plotly 绘图的初次尝试. 本文目的不是介绍如何绘制散点图,而是通过散点图来介绍Plotly 绘图的基础步骤. 1. 绘制散点图:初探 Plotly ...

  3. mongodb删除某个字段

    如下 db.yourcollection.update({ "需要删除的字段": { "$exists": true } }, { "$unset&q ...

  4. 使用Istio灰度发布

    目录 灰度发布 1. Istio 1.1 Istio介绍 1.2 Istio是如何工作的 2. 安装Istio 2.1 环境 2.2 得到二进制文件 2.3 安装istio 3. 部署bookinfo ...

  5. 【Java】枚举类和注解

    一.枚举类的使用 1. 枚举类的说明: 枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类 当需要定义一组常量时,强烈建议使用枚举类 枚举类的实现: JDK 5.0以前需要自定义 JDK 5 ...

  6. javascript for...in

    在JS中我们最常见的循环语句是for循环语句,一个简单的for循环语句如下: for(var i = 0, n = 100; i < n; i++){ // to do somethings . ...

  7. 轻松的工作(deepseek)

    组长:"这里有一百多个地震波形文件,把每一个地震建立一个文件夹,并把地震波形放到对应日期的地震中." 我想:一个一个整好麻烦想摸会鱼 让我们来deepseek吧~ 首先,生成文件夹 ...

  8. 新装ubuntu电脑的一些调整

    必要命令的安装 必要开发工具的安装 更换国内软件源 /etc/apt/sources.list文件,后面添加下面地址用来添加阿里源 deb http://mirrors.aliyun.com/ubun ...

  9. CAS前后端分离解决方案

    CAS前后端分离解决方案 关于CSS服务器的搭建和整合SpringBoot参考:CAS5.3服务器搭建与客户端整合SpringBoot以及踩坑笔记 环境与需求 后端:springboot 前端: vu ...

  10. ESP32+Arduino入门(一):开发环境搭建

    前言 作为一名硬件小白,在动手组装了一下小智AI之后,感觉还挺有意思的,也想开始学习ESP32了. ESP32介绍 ESP32 是乐鑫科技(Espressif Systems)推出的一款高性能.低功耗 ...