webpack 用于编译 JavaScript 模块。安装完成,就可以通过 webpack 的 CLI或 API与其配合交互。动态打包(dynamically bundle)所有依赖项,创建所谓的依赖图(dependency graph)。每个模块都明确表述它自身的依赖,避免打包未使用的模块。还可以通过 loader 引入任何其他类型的文件。用来构建网站或 web 应用程序中的所有非 JavaScript 内容。

基本安装

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

mkdir learn_webpack && cd learn_webpack
npm init -y
npm install webpack webpack-cli --save-dev

ES2015 中的 import 和 export 语句已经被标准化。虽然大多数浏览器还无法支持它们,但是 webpack 能够提供开箱即用的支持。事实上,webpack 在幕后会将代码“转译”,以便旧版本浏览器可以执行。webpack 不会更改代码中除 import 和 export 语句以外的部分。如果使用其它 ES2015 特性,需要在 webpack 的 loader 系统中使用了一个类似 Babel 转译器。

配置文件

在 webpack 4 中,可以无须任何配置使用,然而大多数项目会需要很复杂的设置,所以webpack 仍然要支持配置文件。这比在终端(terminal)中手动输入大量命令要高效的多,创建一个配置文件: webpack.config.js

执行 webpack --config webpack.config.js

如果 webpack.config.js 存在,则 webpack 命令将默认选择使用它。这里使用 --config 选项只是想表明,可以传递任何名称的配置文件。适用于拆分成多个文件的复杂配置。

管理资源

  1. 加载CSS:从 JavaScript 模块中 import 一个 CSS 文件,需要在配置中安装并添加 style-loadercss-loader

    npm install --save-dev style-loader css-loader
  2. 加载图片:npm install --save-dev file-loader
  3. 加载数据:默认是支持JSON文件的(import Data from './data.json'),要导入导CSV 及 XML,需要安装:

    npm install --save-dev csv-loader xml-loader
module.exports = {
// ...
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.(png|svg|jpg|gif)$/,
use: ['file-loader']
},
{
test: /\.(woff|woff2|eot|ttf|otf)$/,
use: ['file-loader']
}, {
test: /\.(csv|tsv)$/,
use: ['csv-loader']
},
{
test: /\.xml$/,
use: ['xml-loader']
}
]
}
};

管理输出

  1. 设定 html-webpack-plugin:该插件将生成一个 HTML5 文件,所有的 bundle 会自动添加到 html 中;
  2. 设定clean-webpack-plugin:清理 /dist 文件夹,监听文件改变重新生成,未改变文件不会被清理;
  3. 设定webpack-manifest-plugin(可选): 能够对「模块映射到输出 bundle 的过程」保持追踪。可以将数据提取到一个 json 文件中;说白了就是生成一个manifest.json 默认文件名, 是一个文件清单, 内容是打包前文件对应打包后的文件名。
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const { WebpackManifestPlugin } = require('webpack-manifest-plugin'); module.exports = {
plugins: [
new CleanWebpackPlugin({
cleanStaleWebpackAssets: false
}),
new HtmlWebpackPlugin({
title: '文档标题'
}),
new WebpackManifestPlugin(),
],
};

构建一个开发环境

使用 source map

当 webpack 打包源代码时,会很难追踪到错误和警告在源代码中的原始位置。将多个源文件打包到一个bundle.js中,其中一个源文件包含一个错误,那么堆栈跟踪就会简单地指向到 bundle.js。这通常并没有太多帮助,开发人员需要准确地知道错误来自于哪个源文件。

为了更容易追踪错误和警告,JavaScript 提供了 source map功能,将编译后的代码映射回原始源代码。source map 会明确指出错误来自于哪个源文件及确切位置。

module.exports = {
// ...
devtool: 'inline-source-map', // 避免在生产中使用 inline-***, 会增加 bundle 大小,并降低整体性能。
};

选择一个开发工具

每次要编译代码时,手动运行 npm run build 很麻烦。,webpack 中有几个不同的选项,可以实现代码发生变化后自动编译代码:

  1. 观察模式:webpack's Watch Mode
  2. webpack-dev-server
  3. webpack-dev-middleware

观察模式

可以指示 webpack watch 依赖图中的所有文件的更改。如果其中一个文件被更新,代码将被重新编译,不必手动运行整个构建。添加一个用于启动 webpack 的观察模式的 npm script 脚本:

package.json

"scripts": {
"watch": "webpack --watch",
},

在命令行中运行 npm run watch,会看到 webpack 编译代码,却不会退出命令行,因为 script 脚本还在观察文件。当修改一个文件并保存后,可以看到 webpack 自动重新编译修改后的模块!

唯一的缺点: 需要刷新浏览器才能看到修改后的实际效果,而使用 webpack-dev-server,可以实现自动刷新浏览器。

webpack-dev-server

webpack-dev-server提供了一个简单的 web 服务器,并且能够实时重新加载(live reloading)。npm install --save-dev webpack-dev-server

webpack.config.js

module.exports = {
// 在 localhost:8080 下建立服务,将 dist 目录下的文件,作为可访问文件。
devServer: {
contentBase: './dist' // 开发服务器(dev server),查找文件位置
},
};

package.json

"scripts": {
"start": "webpack-dev-server --open",
},

在命令行中运行 npm start,会看到浏览器自动加载页面。修改和保存任意源文件,web 服务器就会自动重新加载编译后的代码。

webpack-dev-middleware

webpack-dev-middleware 是一个容器(wrapper),可以把 webpack 处理后的文件传递给一个服务器(server)。 webpack-dev-server 内部使用了它,同时也可以作为一个单独的包来使用。

webpack-dev-middleware 配合 express server 使用:npm install --save-dev express webpack-dev-middleware

webpack.config.js

module.exports = {
// ...
output: {
// ...
publicPath: '/' // 会在服务器脚本用到,以确保文件资源能够在 http://localhost:3000 下正确访问
}
};

server.js

const express = require('express');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware'); const app = express();
const config = require('./webpack.config.js');
const compiler = webpack(config); // Tell express to use the webpack-dev-middleware and use the webpack.config.js
// configuration file as a base.
app.use(webpackDevMiddleware(compiler, {
publicPath: config.output.publicPath
})); // Serve the files on port 3000.
app.listen(3000, function () {
console.log('Example app listening on port 3000!\n');
});

package.json

"scripts": {
"server": "node server.js",
},

在命令行中运行 npm run server,打开浏览器 http://localhost:3000,webpack 应用程序已经运行。

webpack4.15.1 学习笔记(二) — 配置及开发环境构建的更多相关文章

  1. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

  2. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  3. amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules

    amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules 一.总结 1.am:以 am 为命名空间 2.模块状态: {命名空间}-{模块名}-{状态描述} 3.子模块: {命名空间}- ...

  4. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component

    amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...

  5. amazeui学习笔记二(进阶开发1)--项目结构structure

    amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...

  6. Redis学习系列二之.Net开发环境搭建及基础数据结构String字符串

    一.简介 Redis有5种基本数据结构,分别是string.list(列表).hash(字典).set(集合).zset(有序集合),这是必须掌握的5种基本数据结构.注意Redis作为一个键值对缓存系 ...

  7. angularjs2 学习笔记(一) 开发环境搭建

    开发环境,vs2013 update 5,win7 x64,目前最新angular2版本为beta 17 第一步:安装node.js 安装node.js(https://nodejs.org/en/) ...

  8. 【webpack学习笔记】a04-建立开发环境

    开发环境就是在开发过程中为了方便配置的环境,生产环境就是开发完成即将上线的情况. 好了,说了句废话,切入正题. 在开发时,打包后的文件压缩成一团,报错调试的时候傻眼了有木有?每次做出修改需要到浏览器查 ...

  9. 【深度学习笔记】Anaconda及开发环境搭建

    在学习了一段时间台大李宏毅关于deep learning的课程,以及一些其他机器学习的书之后,终于打算开始动手进行一些实践了. 感觉保完研之后散养状态下,学习效率太低了,于是便想白天学习,晚上对白天学 ...

  10. Struts2学习笔记二 配置详解

    Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的name ...

随机推荐

  1. pageOffice插件 springboot实现服务器上Word文档在线打开编辑保存

    需求: 在oa系统上,想实现在线,服务器上doc,docx文档,在web打开,编辑.编辑后,可以再同步保存到服务器端. 开发环境: java springboot,thymeleaf 服务器环境: 无 ...

  2. .eslintrc.js 文件语法规则定义

    添加某个全局变量: globals: { 'ActiveXObject': true },

  3. Django项目目录结构

  4. BLP 模型

    公号:Rand_cs BLP 模型 本篇文章是调研了许多资料后对 BLP 模型的一个总结 MLS,Multi-level Security,主要关心的是数据机密性 D. Elliott Bell 和 ...

  5. 铭瑄 USB 供电不足

    铭瑄 USB 供电不足 可能是USB固件开了节能,节能状态和某些设备会不兼容,更新固件试试固件链接:链接:https://pan.baidu.com/s/1RxHEddYe6TWMDlMJ3PQB1Q ...

  6. 如何将 iPhone 的照片同步到 windows 电脑上

    首先在电脑上,新建一个文件夹,并把共享权限打开. 文件夹 右键 属性,共享,添加 Everyone. 然后,让手机和电脑连接到同一个局域网,手机热点即可. 在手机端看 文件 app,找到电脑的共享文件 ...

  7. 一个常见的 JavaScript 解构陷阱

    在日常的 JavaScript 编码中,我们经常使用解构语法来提取对象中的属性.假设我们有一个名为 fetchResult 的对象,代表从接口返回的数据,其中包含一个字段名为 data. const ...

  8. vue使用wx-open-launch-weapp

    vue使用wx-open-launch-weapp 官方文档 <template> <div style="width: 100%; height: 100%;" ...

  9. postman Could not get any response 无法请求

    外网访问接口地址,刚开始考虑到是阿里云服务器上面的ECS网络安全策略拦截,添加了白名单, 首先在浏览器中回车访问,页面有反应. 但是在postman中请求,仍然返回 Could not get any ...

  10. 新浪微博动态 RSA 分析图文+登录

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 新浪微博动态 RSA 分析图文+登录 日期:2016-10 ...