7.使用字体

7.1.安装字体库-font-awesome

我们通过npm来安装字体

npm install font-awesome --save  

这个时候,我们的package.json配置文件变成这样:

{
"name": "code",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "webpack",
"start": "webpack-dev-server",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"css-loader": "^0.28.7",
"file-loader": "^1.1.5",
"html-webpack-plugin": "^2.30.1",
"style-loader": "^0.19.0",
"url-loader": "^0.6.2",
"webpack": "^3.10.0",
"webpack-dev-server": "^2.9.7"
},
"dependencies": {
"font-awesome": "^4.7.0"
}
}

  

注意:我们在安装第三方包的时候,可以使用下面两条命令

npm install font-awesome --save

以及

npm install font-awesome --save-dev
这两条命令的区别是,--save 安装的是项目依赖,会把当前安装的包一起打包随着项目发布到线上,而--save-dev安装的包属于开发依赖,不会和项目一起打包发布到线上,例如,像webpack-dev-server这样的包,我们只是在本地开发的时候使用,方便调试,而不需要发布到线上的,通常我们都会作为开发依赖安装,像font-awesome这样的包,我们线上的网页也会使用,所以会一起打包发布,所以通常我们都会作为项目依赖安装,开发依赖包的安装信息在package.json中devDependencies这个属性下面,项目依赖包的安装信息在package.json中的dependencies属性下面

7.2.使用字体库

在index.js 文件中引入

// 引入带有字体的css文件,用来测试webpack是否支持字体大包
import "font-awesome/css/font-awesome.css"

这个时候,我们通过npm start命令来启动,查看效果,此时会报一个熟悉的错误

RROR in ./node_modules/font-awesome/fonts/fontawesome-webfont.ttf?v=4.7.0
Module parse failed: Unexpected character '' (1:0)
You may need an appropriate loader to handle this file type.
(Source code omitted for this binary file)
@ ./node_modules/css-loader!./node_modules/font-awesome/css/font-awesome.css 6:645-696
@ ./node_modules/font-awesome/css/font-awesome.css
@ ./src/index.js
@ multi (webpack)-dev-server/client?http://localhost:8080 ./src/index.js 

错误的意思是我们需要使用一个loader来处理字体文件,现在去打开font-awesome.css这个文件,查看里面到底有哪些内容(这个文件位置在node_modules/font-awesome/css/font-awesome.css)

@font-face {
font-family: 'FontAwesome';
src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');
src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
font-weight: normal;
font-style: normal;
} 

通过上面font-awesome文件的内容,我们知道了它引入了它上级文件夹fonts中的字体文件,这些字体文件包括:.eot、.svg、.ttf、.woff、.woff2等格式,错误信息告诉我们的就是webpack不支持打包这些格式的文件,那么,我们应该使用什么loader来让webpack支持打包这些文件呢?

让我们来回顾一下file-loader做的事情

1. 将文件移动到输出目录
2. 自动处理url后面的文件路径,得到一个最终的引用路径

当文件被移动到输出目录,并且有一个最终正确路径的时候,我们就可以正确使用这个文件了,所以,我们尝试使用file-loader来支持上面那些格式的字体文件

在webpack中增加配置,通过设置字体格式的匹配规则来使用file-loader,原理和处理图片一样

 // 处理文字
{
test: /\.(eot|svg|ttf|woff|woff2)$/,
use: ['file-loader']
} 

接下来,我们通过命令打包

npm run dev

这个时候,会发现dist这个输出目录下已经多出来几个字体文件了

我们接下来去测试,我们的字体能不能正常使用,我们在src下面index.html文件中输入以下内容,引入图标

<div id="app">
<i class="fa fa-bath" aria-hidden="true"></i>
<i class="fa fa-envelope-open" aria-hidden="true"></i>
<i class="fa fa-microchip" aria-hidden="true"></i>
<i class="fa fa-user-circle-o" aria-hidden="true"></i>
</div> 

然后,我们需要再次运行命令打包

npm run dev

文件打包出来后,我们直接运行html文件,注意:这个时候不要通过服务器去访问,直接本地浏览器打开就好

打开后,如果看到我们引入的图标,证明webpack已经正常支持引入字体了

8.babel相关

8.1.babel是什么?

Babel 是一个 JavaScript 编译器,它使用非常广泛,可以将es6转换成es5,从而在一些不支持es6的浏览器中运行,这意味着你写es6代码的时候就不需要去关心浏览器是否支持es6

点击进入babel中文地址

点击进入babel官方地址

8.2.使用babel

我们新建一个babel-demo的目录来演示bebel的使用,进入到babel-demo目录后,运行命令初始化项目

npm init -y

这条命令的作用是在babel-demo目录下生成一个package.json的文件

接下来,我们需要安装babel-cli

npm install --save-dev babel-cli

  

babel-cli是命令行工具,安装以后我们就可以在命令行中通过babel命令来转码

安装好后,我们写一段代码来测试一下babel的编译转码功能,在babel-demo目录下新建index.js文件,编写下面代码:

() => console.log("hello nodeing.com")

  

接下来,通过babel命令去编译index.js

./node_modules/.bin/babel index.js

  

如果你想每次运行babel的时候都输 ./node_modules/.bin/babel这么一长串命令, 你可以把这个命令配置到package.json中

{
"name": "babel-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "./node_modules/.bin/babel index.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"babel-cli": "^6.26.0"
}
}

  

这个时候,我们通过npm的命令来启动编译

npm run build

  

运行后的结果,原样输出了index.js中的内容,为什么babel并没有编译我们的index.js文件呢?

原因在于,babel是基于插件的,插件就是提供的一些扩展功能,如果没有告诉babel用哪个插件来做事情,那么babel就不会处理

8.3.babel插件

前面我们讲到,babel是基于插件的,做不同的事情需要不同的插件,这样让babel非常灵活并且强大

点击打开babel插件文档页,中文地址

点击打开babel插件文档页,英文地址

我们去找到transform-es2015-arrow-functions这个插件,点进去查看它的使用,这个插件的功能是帮助我们把es2015(es6)的箭头函数编译成es5代码

下面我们来安装这个插件

npm install --save-dev babel-plugin-transform-es2015-arrow-functions

  

安装好以后,我们需要在babel-demo目录下新建.babelrc文件,这个文件就是babel的配置文件,我们在这个配置文件中增加配置项

{
"plugins": [
"transform-es2015-arrow-functions"
]
}

  

然后,运行npm命令,查看效果

npm run build

  

运行结果:

(function () {
_newArrowCheck(this, _this); return console.log(1);
}).bind(this);

  

接下来,我们去修改index.js 文件,增加其他的es6语法

() => console.log(1)

class demo{}

  

再去执行npm run build命令,得到的效果也是原样输出,这个原因和前面我们遇到的一样,它需要安装另一个插件才能让babel工作起来,要不然就什么都不做

npm install --save-dev babel-plugin-transform-es2015-classes

  

安装好后,同样需要去修改.babelrc文件,增加配置

{
"plugins": [
"transform-es2015-arrow-functions",
"transform-es2015-classes"
]
}

  

接下来就可以运行npm run build命令来查看效果了

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

(function () {
return console.log(1);
}); let demo = function demo() {
_classCallCheck(this, demo);
};

  

以上就是babel的插件使用方法

8.4.babel的preset

通过插件的学习,我们知道了babel要去解析转换es6语法,需要安装对应的插件,我们只是使用到了两个es6的语法就装了两个插件,当我们需要使用很多es6语法的时候,那就需要装非常多的插件,这样显得非常麻烦,那么有没有简便点的方法呢?

babel通过preset来解决我们上面提出的问题,preset叫做预设,意思就是说预先设置一些常用的语法配置,把一批常用的相关的插件打包来满足我们的开发,例如:我们处理es6语法的时候,我们就把和es6相关的语法插件打包在一起,组成一个预设,这个预设叫做es2015,所以,当我们下载一个es2015这个预设的时候,本质上就是去下载一批和es6相关的语法插件,这样我们就不用每次去下载配置插件了

安装preset-es2015

npm install babel-preset-es2015 --save-dev

  

安装好后,需要去修改.babelrc配置文件

{
"presets": [
"es2015"
]
}

  

最后,通过npm run build命令,查看编译结果

8.5.webpack和babel

让我们把目录切换到webpack-demo目录,修改webpack-demo下的index.js加入下面一段es6代码

// 测试es6是否被编译成es5
()=>console.log("hello nodeing!!!")

  

然后运行命令查看结果

npm run dev

  

在打包出来的app.js文件中查看到,我们写的es6代码原样输出,webpack并没有把es6代码编译成es5

要让es6代码被编译,我们需要借助babel的力量,这里我们需要安装babel-loader和babel-core以及处理es6语法的预设,babel-loader的作用就是将es6代码送给babel-core处理,babel-core就是babel工作的核心api

安装babel-core和babel-loader以及处理es6的预设

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

  

在webpack-demo目录中新建.babelrc文件,增加babel配置

{
"presets": [
"es2015"
]
}

  

接下来需要在webpack.config.js文件中增加配置项

在rules规则数字中增加下面代码

{
test: /\.js$/,
use:['babel-loader']
}

  

运行npm run dev命令把index.js打包成app.js,在app.js中我们查看到,原来的es6代码已经成功转换成es5代码了

// 测试es6是否被编译成es5
(function () {
return console.log("hello nodeing!!!");
});

  

8.6.优化babel-loader

当我们写这个正则表达式 (/.js$/) 的时候,表示所有js文件都会被送babel-loader加载,然后由babel-core处理一边,这里包括我们安装的很多第三方包,你会发现node_modules文件夹下会有很多的js文件,但是这些js文件已经由开发者打包好了我们可以直接使用的,并不需要我们再去处理一遍,因此,如果babel-loader再去处理的话,会浪费太多的时间,导致webpack打包编译很慢,我们现在需要优化它。具体的做法是排除不需要再次编译的,让babel-loader只处理我们开发的源文件,因此,我们需要修改webpack.config.js中的配置

{
test: /\.js$/,
use:['babel-loader'],
exclude: path.resolve(__dirname, 'node_modules')
},

  

其中,exclude: path.resolve(__dirname, 'node_modules') 这条语句表示排除node_modules这个文件夹,因为这个文件夹下放的都是第三方包,并不需要我们再次用babel去编译了

再次运行npm run dev去打包的时候会发现已经快很多了

webpack最佳入门实践系列(4)的更多相关文章

  1. webpack最佳入门实践系列(6)

    10.css模块化 10.1.什么是css模块? CSS模块就是所有的类名都只有局部作用域的CSS文件,当你在一个JavaScript模块中导入一个CSS文件时,CSS模块将会定义一个对象,将文件中类 ...

  2. webpack最佳入门实践系列(5)

    9.路径相关 原来我们打包的东西都存放到了dist目录下,并没有进行分类存储,乱成一团,这一节我们就要处理一下打包的路径,让打包后的目录看起来更加优雅 9.1.代码准备 我们先建立起这样一个目录结构 ...

  3. webpack最佳入门实践系列(3)

    6.使用图片 6.1.尝试在css中引入图片 在src目录下新建css文件夹,并且在css文件夹下创建app.css文件,在src目录下新建images文件夹,放入一张图片,在app.css中引入这张 ...

  4. webpack最佳入门实践系列(2)

    3.插件 在前端迅速发展的今天,许多没有太多技术含量并且感觉是在浪费时间的事情,就可以交给构建工具来做,例如:我们去手动创建index.html,手动引入打包好的js文件等操作,都可以叫个webpac ...

  5. webpack最佳入门实践系列(1)

    1.webpack简介 webpack 是一个现代 JavaScript 应用程序的模块打包器(module bundler).它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源 1 ...

  6. webpack的入门实践,看这篇就够了

    webpack的入门实践 我会将所有的读者概括为初学者,即使你可能有基础,学习本节之前我希望你具有一定的JavaScript和node基础 文中的 ... ...代表省略掉部分代码,和上面的代码相同 ...

  7. 【Vuejs】301- Vue 3.0前的 TypeScript 最佳入门实践

    前言 我个人对更严格类型限制没有积极的看法,毕竟各类转类型的骚写法写习惯了. 然鹅最近的一个项目中,是 TypeScript+ Vue,毛计喇,学之...-真香! 1. 使用官方脚手架构建 npm i ...

  8. python 最佳入门实践

    勿在浮沙筑高台,无论什么技术,掌握核心精神和api,是很重要的. 但是入门过程也可能不是一帆风顺的,这里有八个入门任务,看看你完成了没有: http://code.tutsplus.com/artic ...

  9. es6+最佳入门实践(13)

    13.模块化 13.1.什么是模块化 模块化是一种处理复杂系统分解为更好的可管理模块的方式.通俗的讲就是把一个复杂的功能拆分成多个小功能,并且以一种良好的机制管理起来,这样就可以认为是模块化.就像作家 ...

随机推荐

  1. java-访问控制修饰符

    访问权限 public    任何情况都可以访问 默认包 本包范围内可以访问到 protect       同一个包里的所有类所可以访问:所有子类(子类可以不和父类在同一个包)都可以访问 privat ...

  2. 【Python 2 到 3 系列】 print 是函数

    v3.0 以前,print一直作为语法结构存在,他是python语法的一部分:这个理解起来可能有点蹩脚,但的确是这样. print 一直被定以为一个statement,也就是说,他跟return/tr ...

  3. php-5.6.26源代码 - opcode处理器的注入

    .初始化 opcode处理器列表 // main实现在文件“php-5.6.26\sapi\cgi\cgi_main.c” int main(int argc, char *argv[]) { if ...

  4. PHP 微信公众号之客服完整讲解

    //获取access_token private static function get_access_token($app_id) { $getAuthorizerInfo = wx_auth::g ...

  5. Apache安装之后,在浏览器输入ip无法访问

    博主本来在linux下面配置安装了apache,然后用浏览器输入ip却无法访问 就一直在想是不是dns无法解析的问题,最后才发现原来是防火墙的原因, 在linux下面 service iptables ...

  6. linux无名管道

    特点 无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写 只能在有共同祖先的进程间使用(父子进程.兄弟进程.子孙进程等) fork或者execve调用创建的子进程,继承了父进程的文件描述符 ...

  7. 霍夫直线检测 opencv

    本次实验是检测图像中的直线,用到了HoughLines()和HoughLinesP()函数,其中HoughLinesP()称为累计概率霍夫变换,实验结果显示累计概率霍夫变换要比标准霍夫变换的效果好.具 ...

  8. Hive数据导入导出的n种方式

    Tutorial-LoadingData Hive加载数据的6种方式 #格式 load data [local] inpath '/op/datas/xxx.txt' [overwrite] into ...

  9. javaScript编辑器sublime的安装

    最近在学习js,学习任何一门语言之前,当然免不了最初的环境安装: 见:http://www.cnblogs.com/zhcncn/p/4113589.html

  10. 1 web应用

    web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端/服 ...