webpack实战——打包第一个应用

写在前面

最近学习了一些关于webpack的知识,在此做一些纪录。
作为前端开发者,我们以前在浏览器中运行 JavaScript ,会引用一些脚本来存放每个功能;此解决方案很难扩展,因为加载太多脚本会导致网络瓶颈;亦或使用一个包含所有项目代码的大型 .js 文件,但是这会导致作用域、文件大小、可读性和可维护性方面的问题。
后来,模块化诞生……随之而来的是一个新的时代,基于 node.js 的一系列解决方案也是孕育而生,各种功能、方法都是用模块,对于开发、维护也是极大的瓶颈突破和效率提升,但是新的问题随之而来,各种模块不是浏览器支持不够友好,就是各依赖问题难以手动解决或者构建……而 webpack 此时也是破空而出,是用于现代 JavaScript 应用程序的静态模块打包工具。最核心的功能则是解决模块之间的依赖,把各个模块按照特定的规则和顺序组织在一起,最终合并为一个或多个 .js 文件。这个过程也被称为 模块打包
那么webpack到底神秘在何处?为何前端大框架都用它来配置?为何近年面试频频被问?上手难度几何?实际效果又如何?
本专题文章着手纪录webpack实战过程,从零开始着手webpack的配置过程及优化方案,例如模块打包资源输入输出预处理器样式处理代码切割打包优化开发环境调优 等等篇章。
本篇纪录关于webpack的简介以及环境配置、打包第一个应用~

webpack简介

webpack

1. 什么是webpack

webpack是一个开源的Javascript模块打包工具,最核心的功能是解决模块之间的依赖,把各个模块按照特定的规则和顺序组织在一起,最终合并为一个JS文件。

2. 为什么选择webpack

对比同类模块打包工具,具备以下优势:

  • 支持多种模块标准,如AMD,CommonJS及ES6模块等
  • 具有完备的代码分割功能,可以有效减小资源体积,提升首页渲染速度
  • 可以处理各类型资源,如css、png等
  • 拥有庞大的社区支持

安装

1. 环境

  • 操作系统: 无要求
  • 环境: Node.js

此处使用macOS或者windows为例。

2. Node.js安装

打开node.js中文网(http://nodejs.cn/),点击下载项安装对应系统的安装包即可。

3. webpack安装

  1. 新建一个目录作为工程目录

  2. 然后终端进入或者通过命令行工具执行npm初始化:
    npm init

  3. 依次输入所提示的的基本信息,完成后得到一个package.json文件

    webpack安装

  4. 执行安装webpack和webpack-cli
    npm i webpack webpack-cli --save-dev

  5. 执行完成好就完成了安装过程

打包第一个应用

hello world

接着刚才的步骤继续:

  • 项目根目录建入口文件: index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>my first webpack app</title>
</head>
<body>
    
    <script src="./dist/bundle.js"></script>
</body>
</html>
  • 项目根目录新建文件夹src,存放两个js文件:index.jshello.js
  • index.js
// index.js
import hello from './hello.js';

document.write('my first webpack app <br/>');
hello();
  • hello.js
// hello.js
export default function() {
    document.write('hello world!');
}
  • 命令行工具执行打包命令:
npx webpack --entry=./src/index.js --output-filename=bundle.js --mode=development
  • 执行结果(和工程目录)如下:
第一次打包应用
  • 验证结果:浏览器打开index.html,查看页面结果:
    结果

命令优化

在上述打包命令中,我们使用npx webpack --entry=./src/index.js --output-filename=bundle.js --mode=development来执行打包,但这一段命令冗长而又耗时,搞不好还容易出错。那么有没有简洁一些的方法呢?
当然有!

1. 使用 npm scripts 配置

配置

打开根目录的配置文件,编辑一条 scripts 命令:

{
    "name": "w1",
    "version": "1.0.0",
    "description": "打包第一个应用",
    "main": "index.js",
    "author": "zxm",
    "license": "ISC",

    // 添加命令
    "scripts": {
        "build": "webpack --entry=./src/index.js --output-filename=bundle.js --mode=development"
    }
}

scriptsnpm 提供的脚本命令功能,在这里可以直接使用模块所添加的指令。

验证

我们修改hello.js中的输出:

// hello.js
export default function() {
    document.write('hello scripts');
}

然后执行打包命令:npm run build,观察结果:

结果

2. 使用配置文件配置

从上面命令可以看出,我们使用 scripts 命令一样可以代替执行 webpack 的打包命令,并且在命令行工具中使用则会更加简洁。
但是存在一个问题,如果项目需要越来越多的配置,那么就需要往命令中塞入更多的参数,越来越多,到后期,项目的维护成本则正比的增加许多。为了解决此问题,可以将这些参数用对象的配置形式来统一存放到一个配置文件中,然后webpack每次打包都读取该配置文件即可。

  • 根目录新建文件:webpack.config.js,并配置如下代码:
// webpack.config.js
module.exports = {
    // 入口文件指定
    entry: './src/index.js',
    // 输出资源配置
    output: {
        filename: 'bundle.js'
    },
    // 打包模式:develop-开发,production-生产
    mode: 'development'
}
  • 修改package.json文件的scripts > build配置:
{
    ......

    // 修改后如下:
    "scripts": {
        "build": "webpack"
    }
}
  • 校验:修改hello.js的输出:
// hello.js
export default function() {
    document.write(`this is webpack.config\'s result`);
}
  • 执行npm run build,刷新浏览器,看结果:
结果

至此,webpack的初始化环境配置及基础配置已经完毕。但是我们现在遇到一个麻烦事:我们没更改一些代码,则需要重新打包才能去测试,才能看到结果,那么有没有什么简洁的方案处理呢?有!继续操作~

3. 开发优化——热更新

webpack社区为我们提供了一个便捷的本地开发工具:webpack-dev-server

安装

执行安装命令:
npm i webpack-dev-server --save-dev

新增 npm scripts 命令

前面刚写了一个scripts命令,那么此时再添加一个dev来配置。编辑根目录的package.json文件:

{
    ......

    "scripts": {
        "build": "webpack --entry=./src/index.js --output-filename=bundle.js --mode=development",
        "dev": "webpack-dev-server"
    }
}

还没结束,仍需在webpack中配置一下:

webpack.config.js添加dev-server配置

module.exports = {
    ......

    // 新增: dev-server配置
    devServer: {
        publicPath: '/dist'
    }
}

启动本地服务

执行命令npm run dev

执行结果

可以看到,在左侧代码块中修改内容后,只需要保存即可,右边浏览器则自动刷新了~~

这个功能可以脱离dist文件,也就是没有通过实际的打包,为什么会这样呢?
因为webpack-dev-serve其实不会写入实际的bundle.js文件,而是将打包结果运行于内存之中,然后每次webpack-dev-serve接收到请求的时候都将此时内存中的打包结果返回给浏览器端即可。

备注:如果npm run dev启动失败,有可能是webpack webpack-cli webpack-dev-server 的班班之间存在不兼容现象,将这三个卸载后(用 npm uninstall 卸载),同时将这三个安装一下即可:npm install webpack webpack-cli webpack-dev-serve


本篇代码demo存于公众号【流眸】,欢迎扫码关注公众号,可在公众号下回复【2073】获取

小结

本篇文章中,对webpack有了一个基本的介绍: 处理模块之间的依赖并将其打包然后进行了webpack环境的安装和配置:环境、nodeJs、webpack及webpack-cli等。
之后,开始了第一个案例: hello world,然后通过webpack命令进行打包,打包到./dist/bundle.js
最后进行了一波优化,由于直接输入命令过于繁琐,因此借助 npm 脚本或者 webpack.config 来维护 webpack 命令。此时由于频繁的打包也不符合开发条件,因此使用本地服务 webpack-dev-server 来启用一个可热加载的本地服务来处理打包资源和静态文件的请求。

下一篇将会纪录如何编写和使用模块,以及模块打包。敬请期待~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容