1. 概述

本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle

Vue的运行时依赖 (@vue/cli-service)基于 webpack 构建,并带有合理的默认配置,所以作为快速入门,对于webpack的了解是可选的

2. 安装

在开始之前,请确保安装了 Node.js 的最新版本。使用 Node.js 最新的长期支持版本(LTS - Long Term Support),是理想的起步

[root@DESKTOP-MSD7I5A node]# node -v
v16.2.0

安装最新版本或特定版本,请运行以下命令:

npm install --save-dev webpack
npm install --save-dev webpack@<version>

对于大多数项目,我们建议本地安装。这可以使我们在引入破坏式变更(breaking change)的依赖时,更容易分别升级项目

3. 简单使用

3.1. 使用的原因

首先创建一个目录,初始化 npm,然后 在本地安装 webpack,接着安装 webpack-cli(此工具用于在命令行中运行 webpack):

[root@DESKTOP-MSD7I5A node]# mkdir webpack
[root@DESKTOP-MSD7I5A node]# cd webpack
[root@DESKTOP-MSD7I5A webpack]# npm init -y
[root@DESKTOP-MSD7I5A webpack]# npm install webpack webpack-cli

创建index.html、文件夹src、src下的index.js:

[root@DESKTOP-MSD7I5A webpack]# touch index.js
[root@DESKTOP-MSD7I5A webpack]# mkdir src
[root@DESKTOP-MSD7I5A webpack]# mv index.js src/
[root@DESKTOP-MSD7I5A webpack]# touch index.html

目前这个文件夹看起来是这样的:

[root@DESKTOP-MSD7I5A webpack]# ls src ./
./:
index.html node_modules package.json package-lock.json src src:
index.js

index.js中输入:

function component() {
var element = document.createElement('div'); // Lodash(目前通过一个 script 脚本引入)对于执行这一行是必需的
element.innerHTML = _.join(['Hello', 'webpack'], ' '); return element;
} document.body.appendChild(component());

index.html中输入:

<!doctype html>
<html>
<head>
<title>起步</title>
<script src="https://unpkg.com/lodash@4.16.6"></script>
</head>
<body>
<script src="./src/index.js"></script>
</body>
</html>

在此示例中,<script> 标签之间存在隐式依赖关系。index.js 文件执行之前,还依赖于页面中引入的 lodash。之所以说是隐式的是因为 index.js 并未显式声明需要引入 lodash,只是假定推测已经存在一个全局变量 _

使用这种方式去管理 JavaScript 项目会有一些问题:

  • 无法立即体现,脚本的执行依赖于外部扩展库(external library)
  • 如果依赖不存在,或者引入顺序错误,应用程序将无法正常运行
  • 如果依赖被引入但是并没有使用,浏览器将被迫下载无用代码

3.2. 使用webpack打包

首先,我们稍微调整下目录结构,将“源”代码(/src)从我们的“分发”代码(/dist)中分离出来。“源”代码是用于书写和编辑的代码。“分发”代码是构建过程产生的代码最小化和优化后的“输出”目录,最终将在浏览器中加载:

[root@DESKTOP-MSD7I5A webpack]# mkdir dist
[root@DESKTOP-MSD7I5A webpack]# mv index.html dist/

现在这个文件夹的文件分布是这样的:

[root@DESKTOP-MSD7I5A webpack]# ls ./  dist/ src/
./:
dist node_modules package.json package-lock.json src dist/:
index.html src/:
index.js

要在 index.js 中打包 lodash 依赖,我们需要在本地安装 library:

[root@DESKTOP-MSD7I5A webpack]# npm install --save lodash

现在,在我们的脚本中 import lodash

import _ from 'lodash';

现在index.js的内容是这样的:

import _ from 'lodash';

function component() {
var element = document.createElement('div'); element.innerHTML = _.join(['Hello', 'webpack'], ' '); return element;
} document.body.appendChild(component());

现在,由于通过打包来合成脚本,我们必须更新 index.html 文件。因为现在是通过 import 引入 lodash,所以将 lodash <script> 删除,然后修改另一个 <script> 标签来加载 bundle,而不是原始的 /src 文件:

现在的dist下的index.html是这样的:

<!doctype>
<html>
<head>
<title>起步</title>
</head>
<body>
<script src="main.js"></script>
</body>
</html>

在这个设置中,index.js 显式要求引入的 lodash 必须存在,然后将它绑定为 _(没有全局作用域污染)。通过声明模块所需的依赖,webpack 能够利用这些信息去构建依赖图,然后使用图生成一个优化过的,会以正确顺序执行的 bundle

执行 npx webpack,会将我们的脚本作为入口起点,然后 输出main.js

[root@DESKTOP-MSD7I5A webpack]# npx webpack
asset main.js 69.5 KiB [emitted] [minimized] (name: main) 1 related asset
runtime modules 1010 bytes 5 modules
cacheable modules 532 KiB
./src/index.js 304 bytes [built] [code generated]
./node_modules/lodash/lodash.js 531 KiB [built] [code generated] WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value.
Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/ webpack 5.70.0 compiled with 1 warning in 5734 ms
  • 输出可能会稍有不同,但是只要构建成功,那么你可以不要担心

此时的文件目录如下:

[root@DESKTOP-MSD7I5A webpack]# ls ./  dist/ src/
./:
dist node_modules package.json package-lock.json src dist/:
index.html main.js main.js.LICENSE.txt src/:
index.js

可以看到dist文件夹下多了一个main.js和一个main.js.LICENSE.txt许可文件,当然这个许可文件是由于lodash 的发行许可带来的,可以不管

最后在浏览器打开这个index.html:

可以看到显示了Hello webpack

4. 资料参考

[1]起步 | webpack 中文网 (webpackjs.com)

[2]概念 | webpack 中文网 (webpackjs.com)

webpack的快速使用的更多相关文章

  1. 使用Vue2+webpack+Es6快速开发一个移动端项目,封装属于自己的jsonpAPI和手势响应式组件

    导语 最近看到不少使用vue制作的音乐播放器,挺好玩的,本来工作中也经常使用Vue,一起交流学习,好的话点个star哦 本项目特点如下 : 1. 原生js封装自己的跨域请求函数,支持promise调用 ...

  2. vue学习:vue+webpack的快速使用指南(新手向)

    一.vue有两种使用方式: 1.下载vue.js <script src="vue.js"></script> 2.使用npm npm install vu ...

  3. 优雅哥学 Webpack - 01 - Webpack 5 快速体验

    程序员优雅哥简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构 本文摘要:主要讲解 webpack 5 初体验.从webpack 5 初识到便写代码.优雅哥将 ...

  4. npm、webpack、vue-cli 快速上手

    npm+webpack+vue-cli快速上手   Node.js   npm 什么是Node.js  以及npm 简单的来说 Node.js 就是运行在服务端的JavaScript,基于Chrome ...

  5. react webpack.config.js 入门学习

    在学习react 的时候必然会用到webpack打包工具,webpack的快速入门另外一篇文章中有记录,这里只记录webpack.config.js文件,因为每个项目下都必须配置,通俗的讲,它的作用就 ...

  6. webpack 精华文章

    最近迁移 webpack1 到 webpack3 碰到了一些问题,还是通过一些文章,解决了问题.在这里做一个备份,方便以后使用. 从零搭建vue2+vue-router2+webpack3工程 Web ...

  7. Webpack + VueJS 学习、跳坑和总结

    这篇随笔会陆续地更新下去,用于汇集一些关于Webpack的初学跳坑总结还有VueJS的基础知识. Webpack部分 ① 快速建立一个Webpack-Vue项目开发环境(4.39.1-2019/08/ ...

  8. 前端微服务-面向web平台级应用的设计

    从去年开始,前端领域就出现了一个‘微应用’的名词,说的是前端架构的一种设计思路,业内都把它和后端的微服务进行类比,当时忙于公司的项目.没有静下心来好好了解,现在项目结束,再加上最近看的几篇关于前端微服 ...

  9. webpack5文档解析(上)

    webpack5 声明:所有的文章demo都在我的仓库里 webpack5 起步 概念 webpack是用于编译JavaScript模块. 一个文件依赖另一个文件,包括静态资源(图片/css等),都会 ...

  10. Vue.js——60分钟webpack项目模板快速入门

    概述 browserify是一个 CommonJS风格的模块管理和打包工具,上一篇我们简单地介绍了Vue.js官方基于browserify构筑的一套开发模板.webpack提供了和browserify ...

随机推荐

  1. elasticsearch倒排索引(全面了解)

    SimpleAI推荐语: 前年转过这篇文章,最近在看检索相关论文,发现又有点忘记倒排索引(inverted index)的具体内容,遂翻出来再看看,不得不说,这个漫画画的太好了,娓娓道来,一看就懂,再 ...

  2. Vuex极速入门

    01.什么是Vuex? 1.1.为什么需要状态管理? 在复杂的系统中,我们会把系统按照业务逻辑拆分为多个层次.多个模块,采用组件式的开发方式.而此时不同模块.父子模块之间的通信就成了一个问题. 为了解 ...

  3. CLISP学习(二)

    它是一门函数式语言,你要用函数的思维来思考. 只不过与数学的表达不同的是,数学里的函数是在括号外  f(x) ,而lisp是在括号内,以列表的形式(f x), cos(x) --> (cos x ...

  4. python之路51 聚合查询 分组查询

    图书管理系统 1.表设计 先考虑普通字段再考虑外键字段 数据库迁移.测试数据录入 2.首页展示 3.书籍展示 4.书籍添加 5.书籍编辑 后端如何获取用户想要编辑的数据.前端如何展示出待编辑的数据 6 ...

  5. [深度探索C++对象模型]trival constructor和non-trival constructor

    分清楚user-declared constructor和implict default constructor 首先要知道,如果你没有自定义一个类的构造函数,那么编译器会在暗中声明一个构造器,这个构 ...

  6. (Java)设计模式:结构型

    前言 这篇博文续接的是 UML建模.设计原则.创建型设计模式.行为型设计模式,有兴趣的可以看一下 3.3.结构型 这些设计模式关注类和对象的组合.将类和对象组合在一起,从而形成更大的结构 * 3.3. ...

  7. 基于windows系统使用GNVM进行node切换版本

    GNVM是什么? GNVM 是一个简单的 Windows 下 Node.js 多版本管理器,类似的 nvm nvmw nodist . 安装 进入官网,下载你所需要的包,直达链接 下载完成 放到我们的 ...

  8. Flutter新版本2.X系列--01创建项目

    1.新建项目,打开Android studio,点击红圈部分 2.选择第一个 3.设置你的项目名称,flutter sdk位置,以及项目存储路径 4.设置包名,这个要唯一 5.好啦 ~ 作为一名前端开 ...

  9. List_集合_介绍&常用方法-ArrayList集合

    List_集合_介绍&常用方法 我们掌握了Collection接口的使用后,再来看看Collection接口中的子类,他们都具备那些特性呢?接下来,我们一起学习Collection中的常用几个 ...

  10. 构建api gateway之 基于etcd实现动态配置同步

    配置中心 在之前 tcp的yaml配置 介绍了如何监听yaml文件变化然后更新配置. 当然假如我们有很多实例,那么yaml改动将是非常痛苦的事情,那么如何做到配置文件统一管理,实时更新呢? 我们可以引 ...