赞
踩
webpack是现代前端开发中最火的模块打包工具,只需要通过简单的配置,便可以完成模块的加载和打包。
Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
//webpack.config.js var HtmlWebpackPlugin = require('html-webpack-plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); //分离CSS和JS文件 const CleanWebpackPlugin = require('clean-webpack-plugin'); //去除build文件中的残余文件 const path = require('path'); const webpack=require('webpack'); let pathsToClean = [ 'dist' ] module.exports = { entry: { //唯一入口文件 "app.bundle": "./src/app.js", "contact": "./src/contact.js" }, devServer: { //配置本地服务器 port: 8686, //端口号 open: true, //设置是否自动打开 hot:true //模块热替换,热更新 //inline:true //实时刷新 }, output: { //输出文件 path: path.resolve(__dirname, 'dist'), //打包后的文件存放的地方 filename: '[name].[hash].js' //打包后输出文件的文件名 }, plugins: [ new HtmlWebpackPlugin({ //new 一个插件的实例,并传入相关的参数 // title:'hello world' //自动添加HTML的标题 template: './src/index.html', filename: 'index.html', minify: { collapseWhitespace: true }, hash: true, //excludeChunks代表的不包含 excludeChunks: ['contact'] }), new HtmlWebpackPlugin({ template: './src/contact.html', filename: 'contact.html', minify: { collapseWhitespace: true }, hash: true, //chunks代表的是包含 chunks: ['contact'] }), new CleanWebpackPlugin(pathsToClean), new ExtractTextPlugin({ filename:'style.css', disable:true }), new webpack.NamedModulesPlugin(), new webpack.HotModuleReplacementPlugin() //自动刷新实时预览修改后的效果 //new webpack.optimize.UglifyJsPlugin() //压缩JS代码 ], module: { rules: [ { test: /\.css$/, //用以匹配loaders所处理文件的拓展名的正则表达式 use: ['style-loader','css-loader','postcss-loader'] //style-loader要配置在css-loader之前 } ] } }
entry 对象是用于 webpack 查找启动并构建 bundle。其上下文是入口文件所处的目录的绝对路径的字符串。
注:“__dirname”是node.js中的一个全局变量,它指向当前执行脚本所在的目录。
在安装 Webpack 前,本地需要安装nodejs运行环境,下载地址:node,根据你的系统下载版本。
[外链图片转存失败(img-XlB4nGjM-1568858497838)(E:\Typora\笔记地址\markdown\img\webpackImg\node.webp)]
下载安装包后,点击可执行文件,不断地按下一步,就可以安装成功。测试安装是否成功,使用 node -v
,如果显示版本号则表示安装成功。
[外链图片转存失败(img-vFtHVEyv-1568858497840)(E:\Typora\笔记地址\markdown\img\webpackImg\node-v.webp)]
在命令行上输入以下命令:npm install -g webpack
,测试是否安装成功输入 webpack -v
,如果显示版本号则安装成功。
npm i -D webpack
i 是 install 的缩写
npm i -D webpack-cli
命令行的使用
#### 命令解释
-S:--save
的简写,等同于npm run start 只需输入npm start,这两个效果是一样的。
-D:--save-dev
的简写,其包名称及版本号会存在package.json的devDependencies这个里面,而–save则会将包名称及版本号放在dependencies里面。
npm 是 nodejs 管理插件用的工具,install 表示安装,-g 时 gobal 的缩写 表示全局安装。
也可以使用 cnpm, 但是在此之前 需要执行以下命令
npm install -g cnpm --registry=https://registry.npm.taobao.org
[外链图片转存失败(img-xDIjPqlr-1568858497840)(E:\Typora\笔记地址\markdown\img\webpackImg\webpack-v.webp)]
在任意盘符新建一个文件夹,如在D盘创建webpackDemo文件夹;
之后你会看到提示输入一些内容,这不用管,直接全部回车。
如果不想输入 信息 可以加 -y 代表 yes
npm init -y
创建完成之后,会发现 webpack-test目录下多出了一个名为 package.json 的文件,主要是显示这个项目的名称、版本、作者、协议等信息。
{
"name": "webpack-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^3.11.0"
}
}
在命令行中输入
npm install --save-dev webpack
[外链图片转存失败(img-r4FiAjNH-1568858497841)(E:\Typora\笔记地址\markdown\img\webpackImg\npm-install.webp)]
你会看到正在安装 webpack 的进度,稍等片刻,成功之后,我们再来看看 package.json 这个文件的内容,多了下面这几行:
"devDependencies": {
"webpack": "^3.11.0"
}
同时你也会发现,多了一个目录,叫 node_modules,这就是存放刚才安装的 webpack 库所有要用到的源码文件。
如果你使用的是 npm 5,可能还会在目录中看到一个 package-lock.json 文件。
首先我们创建一个目录,初始化 npm,然后 在本地安装 webpack,接着安装 webpack-cli(此工具用于在命令行中运行 webpack):
mkdir webpack-demo && cd webpack-demo
npm init -y
`npm i -D webpack`
`npm i -D webpack-cli `
项目的结构
webpack-demo
+ |- package.json
+ |- /dist
+ |- index.html
+ |- /src
+ |- index.js
第二步:安装 loadash 依赖和编写 js 文件
npm install --save lodash
import _ from 'lodash';
function createDomElement() {
var dom = document.createElement('div');
dom.innerHTML = _.join(['aicoder', '.com', ' wow'], '');
return dom;
}
document.body.appendChild(createDomElement());
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>起步</title>
</head>
<body>
<script src="./main.js"></script>
</body>
</html>
第三步:编写 webpack 配置文件
根目录下添加 webpack.config.js
文件。
webpack-demo
|- package.json
+ |- webpack.config.js
|- /dist
|- index.html
|- /src
|- index.js
webpack.config.js 内容如下:
const path = require('path');
module.exports = {
mode: 'development',
entry: './src/index.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, './dist')
}
};
执行构建任务
npx webpack
打开: dist/index.html 可以查看到页面的结果。
[外链图片转存失败(img-ofms2Wxw-1568858497842)(E:\Typora\笔记地址\markdown\img\webpackImg\newinst.png)]
webpack 最出色的功能之一就是,除了 JavaScript,还可以通过 loader 引入任何其他类型的文件
在webpack的世界里,一起文件都是模块。
默认webpack只会打包js代码,想要打包其它内容,就需要相对应的loader。
不使用loader 的情况
[外链图片转存失败(img-EWhENnao-1568858497843)(E:\Typora\笔记地址\markdown\img\webpackImg\loader-error.png)]
style-loader
和 css-loader
npm install --save-dev style-loader css-loader
or
npm i -D style-loader css-loader
第二步: 添加 css 解析的 loader
const path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, module: { // 这个节点,用于配置 所有 第三方模块加载器 rules: [ // 所有第三方模块匹配规则 { // 加载 以 css为后缀的 文件 test: /\.css$/, // 从右向左读取loader use: ['style-loader', 'css-loader'] } ] } };
css-loader
: 辅助解析 js 中的 import './main.css'
并将其打包
style-loader
: 把 js 中引入的 css 内容 注入到 html 标签中,并添加 style 标签.依赖 css-loader
解释
打开 webpack.config.js
这个配置文件,在里面,新增一个配置节点,叫做 module,它是一个对象;在 这个 module 对象身上,有一个 rules 属性,这个 rules
属性是个 数组;这个数组中存放了所有第三方文件的配置 和处理规则;
注:
1.发现这个 要处理的文件 不是 JS 文件,然后就去 配置文件中,查找有没有对应的第三方 loader 规则
2.如果能找到对应的规则,就会调用 对应的 loader 处理 这种文件类型
3.在调用loader 的时候,是从后往前调用的;
4.当最后的一个 loader 调用完毕,会把处理的结果,直接交给 webpack 进行打包合并,最终输出到bundle.js中去
第三步: 编写 css 文件和修改 js 文件
在 src 目录中添加 style.css
文件
webpack-demo
|- package.json
|- webpack.config.js
|- /dist
|- bundle.js
|- index.html
|- /src
+ |- style.css
|- index.js
|- /node_modules
src/style.css
.hello {
color: red;
}
修改 js 文件
import _ from 'lodash';
+ import './style.css';
function createDomElement() {
let dom = document.createElement('div');
dom.innerHTML = _.join(['aicoder', '.com', ' wow'], '');
+ dom.className = 'hello';
+ or
+ dom.classList.add('box')
return dom;
}
document.body.appendChild(createDomElement());
最后重新打开 dist 目录下的 index.html 看一下文字是否变成颜色。
[外链图片转存失败(img-EDUycR5E-1568858497844)(E:\Typora\笔记地址\markdown\img\webpackImg\webpack-lightgren.png)]
模块(module): 这些选项决定了如何处理项目中的不同类型的模块。
webpack 模块可以支持如下:
(url(...))
或 HTML 文件(<img src=...>)
中的图片链接(image url)
值的类型: RegExp | [RegExp] | function
防止 webpack 解析那些任何与给定正则表达式相匹配的文件。忽略的文件中不应该含有 import, require, define 的调用,或任何其他导入机制。忽略大型的 library 可以提高构建性能。
module.exports = { mode: 'devleopment', entry: './src/index.js', ... module: { noParse: /jquery|lodash/, // 从 webpack 3.0.0 开始,可以使用函数,如下所示 // noParse: function(content) { // return /jquery|lodash/.test(content); // } } ... };
我们可以将 npx webpack 设置 到 package.json 当中 scripts处 ,重复的书写都可以如此
"build": "npx webpack -c webpack.config.js"
创建模块时,匹配请求的规则数组。这些规则能够修改模块的创建方式。这些规则能够对模块(module)应用 loader,或者修改解析器(parser)。
module.exports = { ... module: { noParse: /jquery|lodash/, rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'] } ] } ... };
规则 -->rules : 意思就是 满足 /.css 开头的 必须经过 use[‘style-loader’,‘css-loader’]
上面的每一组就是一个 rule
{ test: Condition }:匹配特定条件。一般是提供一个正则表达式或正则表达式的数组,但这不是强制的。
module.exports = {
...
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
]
}
...
};
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。