随着前端项目复杂度的增加,其所依赖的资源也越来越多,从最初的HTML文件,CSS文件,JS文件发展到现在的各种预处理文件,模板文件等等。文件多了,项目大了,项目的维护就变得更加困难了,用户加载页面的速度也变得更慢了。在这样的背景下,webpack 应运而生,webpack 的主要作用是资源的整合,打包,压缩。使用 webpack,它会自动构建一个项目资源之间的依赖关系图,其中包含项目需要的所有模块,然后把这些资源全部整合打包成一个或多个(根据需要)bundle(包)。

  

一  准备工作

  1,安装 nodejs

  在使用 webpack 之前,我们需要做一些准备工作。由于 webpack 工具是基于 nodejs 开发的,所以我们应该首先在电脑上安装它。

  nodejs 下载地址:https://nodejs.org/en/;根据自己的操作系统下载安装即可。

  装好后它会在你的电脑上创建一个系统命令:node。使用如下命令可以常看当前安装的 node 版本号,如果能正常查看,那么你的 nodejs 就已经安装成功了。

 node -v

  

  2,npm 

  通常情况下,安装 nodejs 会自动安装 npm 工具。npm 工具可以理解成一个平台,安装好后它会在你的电脑上创建一个系统命令:npm。这个工具的主要作用是:在命令行模式下,使用该命令从NPM服务器下载一些包(各种框架等)。

  同样的,使用命令 npm -v 也可以查看当前安装的 npm 工具版本号。如果查到了,那么证明这个工具也安装成功了。

  npm有下面一些常用的命令(在项目目录下使用):  

 npm init

  初始化项目,执行该命令后会有很多配置项,可以根据需要填写,也可以在命令后面添加 -y 参数,使用默认配置。初始化完成后,项目目录下会多一个 package.json 文件,这个文件记录了该项目的所有配置信息,如果你不想使用默认的配置了,那么你随时可以到这里来修改相关项。 

 npm install

  根据 package.json 配置文件,自动配置项目,并加载项目依赖的包。  

 npm install 'bundle'

  安装(下载)你需要的包。比如你需要使用jQuery,你可以使用如下命令:npm install jquery。默认该命令会安装最新版的包,你也可以通过 @ 符号指定版本,比如:npm install jquery@1.12.4。包安装完成后,项目目录下又会多一个node_modules 的目录,这个目录中存放的就是你安装的所有包。  

 npm uninstall ‘bundle’

  移除已安装的包。

 npm list

  查看项目安装了哪些包。

 npm info ‘bundle’

  查看包的详情。

  使用npm命令安装包时,有以下一些可选参数:

    -S 或 --save:包作用于生产环境。

    -D 或 --save-dev:包作用于生产环境和开发环境(常用)。

    -g 或 --global:全局安装。

  如果不带参数 -g 则默认本地安装,即安装在当前项目下。如果使用了全局安装。你可以使用npm root -g 查看全局安装的目录位置。

  小技巧:npm默认下载服务器是国外的,有时候速度难免有点慢,这时你可以使用淘宝在国内的镜像平台,有两种方式实现:第一种,安装cpmn,npm install cnpm -g。第二种,修改默认下载路径,npm config set registry https://registry.npm.taobao.org。

  

  3,自定义命令

  package.json 文件中有一个 scripts 选项,该选项用于自定义 npm 命令,比如稍后我们要讲到的 webpack 命令:

 "scripts":{
"bundle":'webpack'
}
//现在你可以使用 bundle 命令来替代 webpack 了

  自定义命令的使用方式和原始命令有所区别:

 npm run bundle
#通过 npm run 来启动自定义命令

二  webpack

  

  1,安装

  知道了怎么通过 npm 安装包,那么接下来我们就要学习如何安装 webpack 了,其实也很简单,直接使用命令:

 npm install webpack -g

  通常 webpack 使用全局安装,即使用参数 -g 。安装成功后可以通过如下命令查看当前安装的 webpack 版本号:

 webpack -v

  但有时候我们还是希望为某项目单独使用特定版本的 webpack 工具,这时你可以选择本地安装,即不指定参数 -g,它会被安装到 node_modules 目录下 。但本地安装会有一个问题:webpack 命令不能正常使用了。幸好,nodejs 为我们提供了 npx 命令,以在不修改全局目录的情况下使用 webpack 命令。

 npx webpack -v

  

  2,简单使用

  webpack 工具安装成功后,你就可以使用 webpack 命令对项目文件进行打包处理了,命令使用方式也很简单:

 webpack ‘url被打包文件’

  文件打包成功后默认会在项目中新建一个目录 dist,里面会有一个和被打包文件同名的文件,这就是打包之后生成的了。

  

  3,配置文件

  如果希望使用更多 webpack 提供的功能,你需要使用配置文件 webpack.config.js。该文件向外暴露一个对象,供 nodejs 使用,nodejs 根据这个配置对象来决定如何打包文件。

  配置文件有四个核心,他们分别是:入口(entry)、输出(output)、加载器(loader)、插件(plugins)。文件的基本结构如下:

 module.exports = { //node 语法,向外暴露一个对象
entry: '',
output:{},
module:{
rules:[]
},
plugins:[]
};

  entry 规定 webpack 从哪里开始打包,并构建内部依赖关系图。它的值是一个相对路径,一般指向一个具体的文件。比如当前项目目录下的 main.js:

 entry: './main.js'

  output 则是规定 webpack 输出内容的配置对象,通常它需要两个属性:filename(输出文件的名称)和 path(输出路径):

 const path = require('path');//node 的一个 path 模块
module.exports = {
output:{
filename:'main.bundle.js',
path:path.resolve('__dirname','dist')
//通过 path 模块的 resolve 方法,在项目根目录下生成一个 dist 目录,这也是 node 的语法,有兴趣的可以去学习 node,这里只是介绍 webpack,所以不深究
}
}

  module 用于指定 loader。由于 webpack 只认识 JS 文件,当碰到项目中需要打包其他文件,比如 CSS 文件,图片,txt 文件或者其他编程语言文件等等,这时候就需要用到 loader了。loader 用于对模块的源代码进行转换,以便浏览器最终能够认识他们。

 module: {
rules: [
{ test: /\.css$/, use: 'css-loader' },
{ test: /\.ts$/, use: 'ts-loader' }
]
}
//每条规则通过 test 来判断打包的是什么类型的文件,如果匹配成功,将使用本规则 use 所指定的 loader。

  事实上,每条规则可以使用多个 loader,这时 use 需要用数组来保存它们。每个 loader 都有不容的作用,也有一些不尽相同的可选项,如果需要,请查看 webpack 官方文档  LOADER

  plugins 用于配置 webpack 插件,这些插件可以在打包的不同阶段完成一些功能。比如 HtmlWebpackPlugin 插件,它的作用是在打包完成后,在输出目录自动生成一个 HTML 文件,并把打包好的文件引入该 HTML 文件中,下面是它的用法:

 var HtmlWebpackPlugin = require('html-webpack-plugin');
var webpackConfig = {
plugins: [new HtmlWebpackPlugin({
filename:'index.html',
template:'src/test.html'
})]
};

  先在配置文件中引入插件,然后在 plugins 中创建插件实例,创建实例的时候可以给一个配置对象,指定生成的文件名称,和使用什么样的 HTML 模板等。

  注意:loader 和 plugin 都需要使用 npm 先安装到本地才能如上述方式使用。

  

  4,常用 loader 介绍

  在一般项目中,最常用的 loader 包括 url-loader 和 (style-loader & css-loader)。前者用于图片打包,后者用于样式打包。

  url-lorder 用法如下:

 module:{
rules:[
test:/\.(jpg|png|gif)$/, //正则用于匹配图片资源
use:{
loader:'url-loader',
options:{
name:'[name].[ext]', //占位符用于指定图片的名称和后缀名
limit:2048, //规定图片大于2048字节则打包到指定目录(下面的outputPath),否则以Base64编码形式直接打包到输出 js 文件中
outputPath:'images/' //单独指定图片文件指定输出路径
}
}
]
}

  样式 loader 用法:

 module:{
rules:{
test:/\.scss$/,
use:[
'style-loader', // 通过<style>标签向HTML文档注入css样式
'css-loader', // 解析合并css样式文件
'sass-loader' // 解析scss样式文件,如果是其他类型的则需要安装其他loader
]
}
}

  需要注意的是:使用多个 loader 解析时,webpack 调用顺序是从后到前。比如上例中的样式 loader,先使用 sass-loader 把 .scss 文件解析成标准 css 样式,再调用 css-loader 检查是否有多个 css文件,如果有,则将他们合并成一个,最后调用 style-loader 把这些代码通过 <style> 标签注入到 HTML 文档中。

  如果你不想用内联方式引入 CSS 样式,那么你可以使用 <link> 标签的方式:

 import url from 'file.css'
 module: {
rules: [
{
test: /\.css$/,
use: [
{ loader: "style-loader/url" },
{ loader: "file-loader" }
]
}
]
}

  这种方式最终将会在页面中通过标签 <link rel="stylesheet" href="path/to/file.css"> 向页面引入样式。

  

  4,动态监听打包文件

  默认情况下,所有源文件的修改都需要重新运行 webpack 打包命令,这简直太麻烦了。这时你需要动态的监听所有需要被打包的文件,这样,每当我们修改了源文件,webpack 都会自动的把它们重新打包到输出文件。实现方式也很简单:

 module.exports = {
watch:true //默认值是 false,不开启
}

  另一种方式是在运行 webpack 命令时添加 --watch 参数:

 webpack --watch

  动态监听固然不错,但还是有些不尽人意,比如每次都要手动刷新页面才能看到修改后的效果;不方便在服务器运行页面,像 ajax 请求等都不方便测试。

  webpack 提供了 devServer 配置项,可以在打包后在内存中配置一个临时服务器,并把打包后的项目运行在该服务器上。devServer 最强大的地方在于,它把输出目录也保存在内存中,这大大提高了其打包的效率。

 module.exports = {
devServer:{
contentBase:'./dist', //指定服务器目录
open:true //打包完成后立即在浏览器运行
}
}
//打包完成后默认运行在本地路径8080端口,打包的时候别忘啦把 webpack 命令替换成 webpack-dev-server 哦

  devServer 还有很多其他的配置项,你可以在需要的时候查阅 webpack 官网,根据需要配置你需要的选项。( 其实现在很多IDE开发工具都内置了相似的功能,根据需要选择就可以了。)

  5,bable 处理 ES6 语法

  如果你在源代码中使用了 ES6 的语法,可能很多老版本的浏览器并不能正确的执行。这时候你就需要 bable 来帮忙了,bable 是一款 JavaScript 编译器,它的主要功能就是语法转换,即把高版本的语法转换成低版本的语法,用低版本的特性实现高版本的新特性。

  在使用结合 webpack 使用 bable 之前,我们应该先安装一些相关的包:

 npm install --save-dev babel-loader @babel/core
# babel-loader用于连接webpack和bable,@babel/core是一个bable的核心库,用于辅助语法转换
npm install @babel/preset-env --save-dev
# @bable/preset-env 实际负责语法转换
npm install --save @babel/polyfill
# @bable/polyfill 用于注入ES6 的一些新特性

  webpack 中的配置:

 module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/, //排除node_modules中的文件
loader: "babel-loader",
options:{
presets:[
["@babel/preset-env"], //负责实际的编译工作
{
targets:{edge:"17",firefox:"60",chrom:"67",safari:"11"}, //设置运行环境浏览器版本临界值,高于(包含)此版本将不使用 bable 编译
useBuiltIns:"usage" //检测源代码,仅注入使用到的ES6新特性
}
]
}
}
]
}

  源代码中:

 import "@bable/polyfill"
// some code

  关于 webpack 常用的配置就先介绍到这里了,事实上,webpack 还有许多其他的配置项,要全部记住是不太现实的,通常我么建议了解即可,当我们需要某些功能时,知道怎么去查询配置详情即可。

三  Vue-CLI

  Vue-CLI 是基于 webpack 封装而成的脚手架工具,专门用于 Vue 项目的管理,Vue-CLI 封装了许多 webpack 的配置项,让我们只需简单的几步就能实现 webpack 复杂的功能配置。Vue-CLI 极大的简化了项目打包的配置,让我们可以专注于项目本身,而不用过多的操心打包的事情。

  

  1,安装

 npm install -g @vue/cli

  

  2,创建项目

 vue create "项目名称"

  执行创建命令后,如果选择默认设置,将不需要人工干预,直接会成生一个项目的基本目录。如果选择手动设置,则需要人工干预,提供必要的信息。

  默认设置中,Vue-CLI 会自动加载 Vue 项目需要的一些必要的包,后期可以根据需要再手动安装其他的包就行了。Vue-CLI 默认提供了两个命令:

 npm run serve
#打包到内存并在虚拟服务器启动项目,实际使用了 webpack 的 devServer 配置项
npm run build
#打包项目

  基本的项目目录包括:

名称 类型       说明          
node_modules       目录 存放包
public 目录 存放公共资源
src 目录 存放源代码
babel.config.js 文件 引入babel插件
package.json 文件 项目详情
package-lock.json 文件 包详情
readme.md 文件 自述文件
.gitignore 文件 git提交配置

  当你运行了打包命令,默认还会创建一个 dist 目录,部署项目时直接拷贝这个目录到实际生产环境即可。

  小技巧:Vue-CLI 打包的文件被认为将直接在服务器运行,所以如果你使用 file 协议运行 dist 下的文件,将不会成功,Vue-CLI 官方推荐全局安装 http-server (nodejs 静态文件服务器)(npm install serve -g;serve dist -s)或手动修改 publicPath 配置项为相对路径,以对打包文件进行测试,我建议自己在本机搭建一个 web 服务器来测试,这样能更加贴近生产环境。

  3,配置文件

  默认情况下使用 Vue-CLI 创建的项目,不会包含配置文件,这是因为该脚手架工具的设计理念是尽量简化打包相关的配置和操作,并且它已经封装了常用的配置项,不需要我们额外再配置。如果你需要手动配置,你可以在项目根目录下新建一个 vue.config.js 的配置文件,Vue-CLI 提供的配置项请点这里查阅官网,这里不一一举例了。

  如果确实遇到其封装的配置不能满足我们实际需要,Vue-CLI 也提供了一个 configureWebpack 这个配置选项,其值可以是一个对象或一个函数,如果你为其设置了一个对象,那么你可以在这个对象中添加原生的 webpack 配置项。不过,Vue-CLI 建议,尽量不要在 configureWebpack 中配置已经封装的选项,这样做是因为 vue.config.js 中的值会被用在配置里的多个地方,以确保所有的部分都能正常工作在一起。

  

  4,图形界面

  Vue-CLI 不仅提供了常规的命令行界面,还提供了图形化操作界面,这真的是把它的理念贯彻到了极致。

 vue ui
# 安装好 vue-cli 后,直接使用此命令就可以打开图形化界面了

  图形化界面我们一般戏称是傻瓜式配置,只需要根据提示,用鼠标点击开启或是关闭一些配置选项就行了,很少需要自己输入什么内容或命令,所以这里就不多讲了,有兴趣的朋友可以自己试一下。

  

  写在最后:工具会用就行了(除非你是制造工具的人),工作当中的重心依然是业务,遇到工具方面的问题查阅文档就可以了,毕竟互联网发展的那么快,但人的精力始终是有限的!如果内容有误,欢迎指正!

前端工具配置(webpack 4、vue-cli 3)的更多相关文章

  1. 前端工具之WebPack解密--使用

    接上一篇的内容继续来说,背景篇的内容主要是介绍web前端工具的出现的原因和当前主要JavaScript模块化编程的几种规范!这篇内容主要介绍webpack的初级使用! 注意:目前webpack分为两个 ...

  2. 前端工具之WebPack解密之背景

    请注意,这是一篇站在完全新手的角度上来写的文章.可能你是一个后端人员想了解前端工具的使用和概念;也可能你是一个前端小菜(还在DIV+CSS的世界里挣扎着).本文比较适合那些以前完全没有接触过WebPa ...

  3. 使用IDEA工具配置和运行vue项目(详细其中的坑)

    刚来公司实习发现公司的前端使用的是vue,之前根本就没有听说过.然后一上来就需要看代码,but but 就是没有文档什么的东西, 就需要自己去研读,我就想去运行其中的前端和后端联调起来方便理解,结果在 ...

  4. 【前端工具】nodejs+npm+vue 安装(windows)

    预备 先看看这几个是干嘛的,相互的关系是啥. nodejs是语言,类比到php. npm是个包管理,类比到composer. vue是个框架,类比到laravel. webpack是个打包工具. 先下 ...

  5. 配置webpack loader vue 报错:Module build failed: TypeError: this._init is not a function

    单文件组件 引入时报错 配置webpage.config.js中的vue 需要如下写法 { test: /\.vue/, loader: "vue-loader", } 之前写的l ...

  6. @vue/cli 3.x项目脚手架 webpack 配置

    @vue/cli  是一个基于 Vue.js 进行快速开发的完整系统. @vue/cli   基于node服务  需要8.9以上版本 可以使用 nvm等工具来控制node版本  构建于 webpack ...

  7. Vue CLI 是如何实现的 -- 终端命令行工具篇

    Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供了终端命令行工具.零配置脚手架.插件体系.图形化管理界面等.本文暂且只分析项目初始化部分,也就是终端命令行工具的实现. 0. 用法 ...

  8. [转]Vue CLI 3搭建vue+vuex 最全分析

    原文地址:https://my.oschina.net/wangnian/blog/2051369 一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@ ...

  9. Vue CLI 3搭建vue+vuex 最全分析

    一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cli 全局安装的 npm 包,提供了终端里的vue命令(如:vue create .vue ...

随机推荐

  1. Java 循环队列

    传统数组实现的队列有缺陷,当多次入队出队后,队头指针会后移,当队尾指针达到数组末尾时,会提示队列已满,导致数组前部分空间被浪费.如果当队尾和队头指针到达数组末尾时能从数组[0]继续添加数据,可以提升数 ...

  2. 【ARM】---STM32位带操作总结---浅显易懂

    正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能 ...

  3. 《C# 爬虫 破境之道》:第一境 爬虫原理 — 第二节:WebRequest

    本节主要来介绍一下,在C#中制造爬虫,最为常见.常用.实用的基础类 ------ WebRequest.WebResponse. 先来看一个示例 [1.2.1]: using System; usin ...

  4. [题解][Codeforces]Codeforces Round #602 (Div. 1) 简要题解

    orz djq_cpp lgm A 题意 给定一个分别含有 \(\frac n2\) 个左括号和右括号的括号序列 每次可以将序列的一个区间翻转 求一个不超过 \(n\) 次的操作方案,使得操作完之后的 ...

  5. Codeforces940掉分记

    掉分经过 难得这次时间比较好,下午17:35开始. 本来还很高兴,心想这回肯定不会犯困,没准排名能再上升一些呢,,可惜事与愿违-- 上来a题,光看懂题就花了一些时间. 然后开始写,结果第一遍CE,第二 ...

  6. 关于Hive中case when不准使用子查询的解决方法

    在公司用Hive实现个规则的时候,遇到了要查询某个字段是否在另一张表中,大概情况就是 A表: id value1 value2 1 100 0 2 101 1 3 102 1 B表: value1 1 ...

  7. Dubbo入门到实战

    前沿:在当下流行的分布式架构中Dubbo是非常流行的一门技术,借着这几天有空学习学习,并在后面的项目中进行实战,为后面的分布式项目做铺垫. Dubbox简介 Dubbox 是一个分布式服务框架,其前身 ...

  8. 在windows中python安装sit-packages路径位置 在Pycharm中导入opencv不能自动代码补全问题

    在Pycharm中导入opencv不能自动代码补全问题 近期学习到计算机视觉库的相关知识,经过几个小时的探讨,终于解决了opencv不能自动补全代码的困惑, 我们使用pycharm安装配置可能会添加多 ...

  9. 笔记常用Linux命令(三) 查看服务器日志

    服务器日志 用于记录服务器的运行情况 查看服务器日志 tail:查看后面几行 n 显示行数 f 持续侦测后面的内容,查看服务器日志常用 查看最新的服务日志(静态) 命令格式:tail -n 行数 日志 ...

  10. CORS解决跨域问题的几种方法

    一 后端服务器使用过滤器 新建过滤器: /** * 解决跨域 */ public class AccessControlAllowOriginFilter implements Filter { @O ...