获取中...

-

Just a minute...

预先准备

安装node.js:项目开始之前,确保安装了nodejs工具。原则上,你应使用最新的稳定版本(LTS),点击LTS的下载按钮即可。

开发工具:Sublime Text 3,Visual Studio Code, Atom,Hbuilder。选择任意一款工具即可,你也可以使用普通的文本编辑器。

实验环境:

序号 名称 说明
1 操作系统 Window 10
2 nodejs版本 10.15.3 LTS
3 开发工具 Hbuilder

概念简析

webpack是一个JavaScript应用程序的静态模块打包工具,其工作时,html、js、css、image、font等文件被视为资源,每个资源文件被视为一个模块,webpack根据各模块之间的直接或间接依赖关系构建出一个依赖图,最后根据依赖图进行项目文件的打包。

webpack的核心概念有entry、output、loader、plugin、mode等,这些概念的简要说明如下表:

名称 解释 说明
entry 入口 入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后,webpack 会找出与入口起点有直接或间接依赖关系的所有模块(库)。
output 输出 output 属性告诉 webpack 在哪里输出它所创建的 bundle,以及如何命名这些文件。
loader 加载器 webpack 只能理解 JavaScript 和 JSON 文件。loader 让 webpack 能够处理其他类型的文件,并将它们转换为有效模块,以供应用程序使用。
plugin 插件 loader 用于转换某些类型的模块,而plugin可以用于执行范围更广的任务,包括:打包优化,资源管理,注入环境变量。
mode 模式 设置mode参数,以启用webpack在相应环境下的优化处理。其中,参数值为development、production或none。

你可以通过配置文件webpack.config.js来配置所有的参数。配置文件实例:

webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');
const cleanWebpackPlugin = require('clean-webpack-plugin');

//定义文件夹路径
const ROOT_PATH = path.resolve(__dirname);
const SRC_PATH = path.resolve(ROOT_PATH, 'src');
const DIST_PATH = path.resolve(ROOT_PATH, 'dist');

module.exports = {
optimization: {
//初始化
},
entry: {
//入口
},
output: {
//输出
},
mode: 'development',//模式
module: {
//加载器
},
plugins: [
//插件
],
devServer: {
contentBase: DIST_PATH,
historyApiFallback: true,
hot: true,
inline: true
}
};

安装webpack

新建一个项目目录,进入该目录,初始化npm。在本地安装webpack(即在该目录下安装,删除该目录后,安装的webpack便不再存在),安装webpack-cli:

1
2
3
4
mkdir webpack-demo  
cd webpack-demo
npm init -y
npm install webpack webpack-cli --save-dev

安装依赖

安装生产环境依赖

1
npm install jquery --save

安装开发环境依赖

1
npm install webpack-dev-server --save-dev

安装一个 package时,若此 package 要打包到生产环境 bundle 中,你应该使用 npm install --save。若此 package 只用于开发环境中时(例如linter、 测试等开发过程),你应该使用 npm install --save-dev

依赖 说明
jquery 提供jquery函数库
webpack-dev-server 提供web server,提供 live reloading(实时重新加载) 功能,包括自动刷新浏览器页面。

此时的package.json,及各依赖的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack --config webpack.config.js",
"dev": "webpack-dev-server",
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^4.30.0",
"webpack-cli": "^3.3.0",
"webpack-dev-server": "^3.3.1"
},
"dependencies": {
"jquery": "^3.4.0"
}
}

完善项目目录

在webpack-demo 目录下新建dist、src目录,webpack.config.js等文件

1
2
3
4
5
6
webpack-demo
dist
index.html
src
index.js
webpack.config.js

新建文件index.html

1
2
3
4
5
6
7
8
9
<!doctype html>
<html>
<head>
<title>webpack-demo</title>
</head>
<body>
<script src="app.bundle.js"></script>
</body>
</html>

新建文件index.js

1
2
import $ from 'jquery';
$('body').append('Hello webpack-demo!');

新建文件webpack.config.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const path = require('path');

//定义文件夹路径
const ROOT_PATH = path.resolve(__dirname);
const SRC_PATH = path.resolve(ROOT_PATH, 'src');
const DIST_PATH = path.resolve(ROOT_PATH, 'dist');

module.exports = {
optimization: {
concatenateModules: false
},
entry: {
app: SRC_PATH + '/index.js',
},
output: {
path: DIST_PATH,
filename: '[name].bundle.js'
},
mode: 'development',
devServer: {
contentBase: DIST_PATH,
port: 9800,
host: "localhost",
historyApiFallback: true,
hot: true,
inline: true
}

};

添加npm自定义命令

打开package.json文件,修改scripts部分

1
2
3
4
5
6
 "scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack --config webpack.config.js",
"dev": "webpack-dev-server",
"build": "webpack"
},

之后,你可以使用以下命令

1
2
3
4
npm run test
npm run start
npm run dev
npm run build

运行项目

启动实时服务器dev-server

1
npm run dev

此时命令行窗口的输出应该如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ npm run dev

> webpack-demo@1.0.0 dev C:\Users\水煮鱼肠面\Desktop\webpack-demo
> webpack-dev-server

i 「wds」: Project is running at http://localhost:9800/

......

Built at: 2019-04-13 23:14:57
Asset Size Chunks Chunk Names
app.bundle.js 687 KiB app [emitted] app
Entrypoint app = app.bundle.js

......

+ 14 hidden modules
i 「wdm」: Compiled successfully.

你应该关注此条输出

1
+ i 「wds」: Project is running at http://localhost:9800/

在浏览器中打开localhost:9800,你应该看到Hello webpack-demo!

测试实时服务器dev-server

修改index.js

1
2
3
4
import $ from 'jquery';
$('body').append('Hello webpack-demo!');
$('body').append('<br/>');
$('body').append('Test dev-server!');

保存后,浏览器内的页面将自动刷新!

打包项目文件

此时打开dist目录,你将发现index.html中引用的app.bundle.js并不存在!其实未编译打包项目前,app.bundle.js只存在于dev-server的内存中。

运行命令,打包项目

1
npm run build

此时命令行窗口的输出应该如下,dist目录下将生成app.bundle.js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ npm run build

> webpack-demo@1.0.0 build C:\Users\水煮鱼肠面\Desktop\webpack-demo
> webpack

Hash: a2dd1fb50e1fd723cb1c
Version: webpack 4.30.0
Time: 986ms
Built at: 2019-04-13 23:57:05
Asset Size Chunks Chunk Names
app.bundle.js 314 KiB app [emitted] app
Entrypoint app = app.bundle.js
[./src/index.js] 132 bytes {app} [built]
+ 1 hidden module

问题记录

序号 问题 解决方法
1 启动实时服务器dev-server,并打开localhost:9800/页面,浏览器页面空白。再打开浏览器console,将发现错误提示: Uncaught TypeError: Cannot read property 'call' of undefined 安装最新版本的webpack(>=4.30.0)
2 安装依赖的过程中报错 检查网络状况、检查命令是否正确……

问题1的项目issue8996

相关文章
评论
分享
  • Github入门术语

    什么是Git Git是一个版本控制系统(Version Control System),版本控制即记录一个或若干文件内容变化的情况。Git属于分布式版本控制系统,客户端提取文件时总是镜像的完整仓库。 Repository 仓库,...

    Github入门术语
  • Annie主题更新日志

    2019-4-27 主题优化 commit b421393 类型 模块 说明 优化 文章模块 Markdown(重写样式,优化表格、引用等样式) 新增 文章模块 color quote(info、succes...

    Annie主题更新日志
  • 第十四封信·琼萼

    碧云之下, 一分春意, 二分意中人。 App:一言 / 作者:冰野

    第十四封信·琼萼
  • 绝色/余光中

    月色与雪色之间,你是第三种绝色。 美丽而善变的巫娘,那月亮翻译是她的特长却把世界译走了样把太阳的鎔金译成了流银把烈火译成了冰而且带点薄荷的风味凡尝过的人都说译文是全不可靠但比起原文来呢却更加神秘,更加美雪是另一位唯美的译者存心把世界译...

    绝色/余光中
  • 选调和选韵

    填 词既称倚声之学,不但它的句度长短,韵位疏密,必须与所用曲调(一般叫做词牌)的节拍恰相适应,就是歌词所要表达的喜、怒、哀、乐,起伏变化的不同情感,也得与每一曲调的声情恰相谐会,这样才能取得音乐与语言、内容与形式的紧密结合,使听者受...

    选调和选韵
  • QiXi(七夕):一些诗句

    I thought I would be the last shadow in your eyes. 一眼认定你,余生皆是你。 Between the moon and the snow, lies the beauty of yo...

    QiXi(七夕):一些诗句
  • Annie主题使用Hexo-Tag-Plugins

    一、块引用Block Quote tag语法 123{% blockquote [author[, source]] [link] [source_link_title] %}content{% endb...

    Annie主题使用Hexo-Tag-Plugins
  • 相册主题Dream介绍

    新的HEXO主题,主要用于建立相册博客。目前已完成主页、归档页、标签页、分类页等常用页面,主题支持搜索、点赞、浏览人数统计、评论、分享、图片打包下载、图片fancybox浏览。主题演示站点:PREVIEW

    相册主题Dream介绍
  • 《人间失格》抄录1

    手记之三 1 竹一的两大预言,兑现了一个,落空了一个。“被女人迷恋上“这一并不光彩的预言化作了现实,而”肯定会成为一个伟大的画家“的这一祝福性的预言却归于泡影。 我仅仅当上了给粗俗杂志投稿的无名的蹩脚漫画家而已。 由于镰仓的殉情自杀事...

    《人间失格》抄录1
  • 银字笙调,奈何初冬

    文章段落荏苒岁月覆盖了过往,有很多人已经沉沦在琼壶歌月之中,也有很多人长歌倚楼。但在那滚滚红尘中,那座断桥,那场雪;那个秋,那个染火枫林都是昙花一现。而那座桥上,那个愀然的女子更是不入年华。 瑞雪初霁,那一刻有多少凝视?立于红褐色的山...

    银字笙调,奈何初冬