webpack的基础入门
webpack的基础入门
这里对于 webpack 的基础入门进行一些总结,可以参考 github 上的 webpack-demo ,链接是 https://github.com/RealAndMe/webpack-demo
1. 简介
webpack是前端资源加载/打包工具。它将根据模块的依赖关系将一些静态资源 js , less , css
等进行静态分析,然后转化为静态文件,减少页面请求,实现页面的优化。
2. 如何使用webpack
在安装webpack之前,你的本地环境必须要有 node.js
。可以参考之前的博客《npm使用指南》和《node.js的安装配置——前端配置》 。
全局安装webpack和webpack-dev-server
//全局安装webpack 和 webpack-dev-server
$ npm install webpack -g
$ npm install webpack-dev-server -g
webpack
是用来读取配置文件 webpack.config.js
,并构建捆绑包的。
webpack-dev-server
是用来启动服务器的,绑定 localhost:8080
,当更新入口文件时,浏览器会自动刷新。
git clone
克隆github上的代码,并安装依赖项
//克隆代码
$ git clone git@github.com:RealAndMe/webpack-demo.git
//目录下有一个webpack-demo文件夹,切换工作目录到webpack-demo
$ cd webpack-demo
//安装项目运行所依赖的模块
$ npm install
在对应的demo文件夹下面运行源文件
//切换目录,比如demo01
$ cd demo01
//启动服务器
$ webpack-dev-server
启动服务器后,浏览器输入 localhost:8080
就能看到 demo01
的页面内容了。
//webpack打包构建
$ webpack
命令执行之后,会看到 demo01
目录下,生成一个 bundle.js
文档。
下面根据 github
上的 demo
来进行讲解。
demo01: 入口文件(entry file)
查看demo01
main.js
是入口文件,webpack 读取和分析入口文件以及项目的依赖项,然后构建成 捆绑文件boundle.js
输出。
index.html
HTML文档 , main.js
入口的js文件 , webpack.config.js
是 webpack 的配置文件。
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>demo01</title>
<link rel="stylesheet" href="">
</head>
<body>
<script type="text/javascript" src="bundle.js"></script>
</body>
</html>
mian.js
document.write("<h1>hello world!</h1>");
webpack.config.js
module.exports = {
entry: "./main.js",
output: {
filename: "bundle.js"
}
};
代码写好后,在 demo01
目录下,执行命令:
//启动服务器,实现更新入口文件时浏览器自动刷新
$ webpack-dev-server
当 mian.js
文件更新时,执行上面命令行,浏览器自动刷新。浏览器的访问网址:localhost:8080
执行构建命令:
//运行构建
$ webpack
执行完后,会生成一个boundle.js
。
demo02: 多个入口文件
查看demo02
允许有多个入口文件。entry
可以有多个值。执行上述命令,启动服务器浏览内容。执行构建命令,打包入口文件。多个入口文件输出文件也对对应有几个。
webpack.config.js
module.exports = {
entry: {
bundle1: './main1.js',
bundle2: './main2.js'
},
output: {
filename: '[name].js'
}
};
执行构建命令后,会生成两个文档,分别是bundle1.js
和bundle2.js
demo03: babel-loader
查看demo03
babel-loader
可以将 JSX
和 ES6
转换为 JS 文件。
需要的插件依赖有 babel-loader
,babel-core
,babel-preset-es2015
,babel-preset-react
,react-dom
,react
,这些必须在 package.json
文档中配置好,可以通过命令 $ npm install express -save-dev
安装,其中 express
是需要安装的依赖名称。
webpack.config.js
module.exports = {
entry: './main.jsx',
output: {
filename: 'bundle.js'
},
module: {
loaders:[
{
test: /\.js[x]?$/,
exclude: /node_modules/,
loader: 'babel-loader?presets[]=es2015&presets[]=react',
},
]
}
};
代码写好后,在 demo03
目录下执行命令:
$ webpack-dev-server //启动服务器,localhost:8080打开
$ webpack //编译构建
exclude:/node_modules/
用来排除 npm 包,提高编译速度。
loaders
字段分配加载器, test
用正则表达式匹配不同后缀的文件,然后 loader
定义不同的加载器,
注意:
问号?
是通过字符串传递查询参数的,查询字符串格式取决与加载的程序。也可以用另外一种方式来写查询参数。
module: {
loaders: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
query: {
presets: ['es2015', 'react']
}
}
]
}
demo04: css-loader
查看demo04
webpack 允许 js 中请求 CSS 代码。
需要的插件依赖有 style-loader
, css-loader
配置信息中需要两个加载器,style-loader
将 style 插入到 index.html 页面中。 css-loader
读取 CSS 文件。
注意:
loader: "style-loader!css-loader"
两个加载器之间用感叹号!
连接,两者顺序不要更换!
main.js
require("./app.css");
webpack.config.js
module.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
module: {
loaders: [{
test: /\.css$/,
loader: 'style-loader!css-loader',
exclude: /node_modules/
}, ]
}
};
代码写好后,启动服务器,打开控制台,可以看到 index.html
有内联的样式表。
demo05: url-loader
查看demo05
webpack 允许 js 中请求 图片。
需要的插件依赖有 file-loader
, url-loader
。
url-loader
转换图像文件。 后面加了查询参数如果图像尺寸小于8192字节,则将其转换为数据URL; 否则,它将被转换成普通的URL。
main.js
//创建新的元素
var img1 = document.createElement("img");
img1.src = require("./small.png");
//添加
document.body.appendChild(img1);
//创建新的元素
var img2 = document.createElement("img");
img2.src = require("./big.png");
//添加
document.body.appendChild(img2);
webpack.config.js
module.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
module: {
loaders:[
{ test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'}
]
}
};
注意:问号(?)用于将参数传递给装载机。
启动服务器后,打开控制台,small.png
和 big.png
将具有以下URL。
//small.png
<img src="data:image/png;base64,iVBOR...uQmCC">
//big.png
<img src="4853ca667a2b8b8844eb2693ac1b2578.png">
demo06: CSS Module
查看demo06
css-loader?modules
可以启动 CSS 模块的规范。
在默认情况下,模块的 CSS 是局部作用域范围的 CSS ,可以用 :global()
来关闭局部域的作用。
app.css
.h1 {
color:red;
}
:global(.h2) {
color: blue;
}
index.html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1 class="h1">Hello World</h1>
<h2 class="h2">Hello Webpack</h2>
<div id="contain"></div>
<script src="bundle.js" type="text/javascript"></script>
</body>
</html>
main.jsx
var React = require('react');
var ReactDOM = require('react-dom');
var style = require('./app.css');
ReactDOM.render(
<div>
<h1 className={style.h1}>Hello World</h1>
<h2 className="h2">Hello Webpack</h2>
</div>,
document.getElementById('contain')
);
启动服务器,打开浏览器,可以看到只有第二个h1是红色的,因为它的CSS是局部范围的,并且h2都是蓝色的,因为它的CSS是全局范围的。
demo07: UglifyJs Plugin
查看demo07
webpack 有许多扩展功能的插件,比如 uglifyjs plugin
是压缩输出的 boundle.js
的 JS 代码。
webpack.config.js
用到的字段 plugins
用来放插件的。
webpack.config.js
var webpack = require('webpack');
var uglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
module.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
plugins: [
new uglifyJsPlugin({})
]
}
启动服务器,可以看到浏览器页面没有多大的变化。
执行构建命令 $ webpack
可以看到 boundle.js
被压缩成一行,省去了所有的注释,并且将 main.js
细化如下:
var t="Hello";t+=" World",document.write("<h1>"+t+"</h1>")
demo08: 加载第三方插件
查看demo08
不是内置的插件,可以通过 npm install
安装,webpack 允许加载第三方插件。
webpack.config.js
//创建html文档
var htmlWepbackPlugin = require("html-webpack-plugin");
//自动打开浏览器
var openBrowserPlugin = require("open-browser-webpack-plugin");
module.exports = {
entry: "./main.js",
output: {
filename: "boundle.js"
},
plugins: [
new htmlWepbackPlugin(
{
title: "demo08",
filename: "index.html"
}
),
new openBrowserPlugin(
{
url: "http://localhost:8080"
}
)
]
}
html-webpack-plugin
是创建一个 index.html
文档。
需要的依赖是:html-webpack-plugin
npm
安装插件,命令:
//创建.html文档
$ npm install html-webpack-plugin -save-dev
//自动打开浏览器
$ npm install open-browser-webpack-plugin -save-dev
手动启动服务器,浏览器可以看到效果。
构建打包命令:$ webpack
,可以看到 demo 08 目录下生成了一个 index.html
和 bundle.js
open-browser-webpack-plugin
是在启动服务器命令webpack-dev-server
时,会自动打开一个浏览器标签。
需要的依赖 是:open-browser-webpack-plugin
有了这两个插件,就不用手写 index.html
,也不用手动打开浏览器了。
demo09: 代码分割
查看demo09
webpack 允许将代码分割成很多块,提高代码的复用。
webpack.config.js
//CommonJS的: require.ensure进行代码分割
require.ensure(['./a'], function(require) { //require作为参数发送给该函数
var content = require('./a'); //函数体进一步调用require执行所需要的模块。
document.open();
document.write('<h1>' + content + '</h1>');
document.close();
});
使用 CommonJS 模块语法
的 require.ensure
来定义分割点。
require.ensure(dependencies, callback)
dependencies
: 字符串,声明callback
要执行的代码所需要的所有模块。callback
函数功能。将require
作为参数发送给此函数,函数体可以使用它来进一步require()
执行需要的模块。
执行命令$ webpack
,构建打包,会生成两个文档,bundle.js
和 0.bundle.js
。HTML文档根据需要,从bundle.js
中加载0.bundle.js
。
demo10: bundle-loader
查看demo10
代码分割,用 bundle-loader
,与 demo09 相似。
webpack.config.js
var load = require('bundle-loader!./a.js');
load(function(file) {
document.open();
document.write('<h1>' + file + '</h1>');
document.close();
});
需要安装依赖 : bundle-loader
demo11: 公共块 (CommonsChunkPlugin)
查看demo11
CommonsChunkPlugin
由多个入口点之间共享的公共模块组成。
语法:
new webpack.optimize.CommonsChunkPlugin(options)
new webpack.optimize.CommonsChunkPlugin(options)
不再支持废弃的webpack 1构造函数。改用相应的选项对象。
option
选项有:(具体可以参考其官网)
{
//公共块的块名称
name: string,
//公共块的文件名名称
filename: string,
minChunks: number|Infinity|function(module, count) -> boolean,
chunks: string[],
children: boolean,
async: boolean|string,
minSize: number,
}
执行命令后,目录结构为:(init.js
是公共块)
demo12: 全局变量
查看demo11
如果你想要用一些全局变量,但是又不将它们包含在webpack捆绑包中,可以在 webpack.config.js
中添加一个字段 externals
webpack.config.js
module.exports = {
entry: './main.jsx',
output: {
filename: 'bundle.js'
},
module: {
loaders:[
{ test: /\.js[x]?$/, exclude: /node_modules/, loader: 'babel-loader?presets[]=es2015&presets[]=react' },
]
},
externals: {
'data': 'data'
}
};
mian.jsx
var data = require('data');
var React = require('react');
var ReactDOM = require('react-dom');
ReactDOM.render(
<h1>{data}</h1>,
document.body
);
有道云笔记参考:
http://note.youdao.com/noteshare?id=7ac7a9098e636391abc936e439146601&sub=5A5BC060648D43EF8017DF898C073B45
webpack的基础入门的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- webpack+sass+vue 入门教程(一)
一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...
- 「译」JUnit 5 系列:基础入门
原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...
- .NET正则表达式基础入门
这是我第一次写的博客,个人觉得十分不容易.以前看别人写的博客文字十分流畅,到自己来写却发现十分困难,还是感谢那些为技术而奉献自己力量的人吧. 本教程编写之前,博主阅读了<正则指引>这本入门 ...
- 从零3D基础入门XNA 4.0(2)——模型和BasicEffect
[题外话] 上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上.本文接着上一篇文章继续,介绍XNA中模型的结构.BasicEffect的使用以 ...
- 从零3D基础入门XNA 4.0(1)——3D开发基础
[题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...
- Shell编程菜鸟基础入门笔记
Shell编程基础入门 1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- [Spring框架]Spring AOP基础入门总结一.
前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...
随机推荐
- b6
吴晓晖(组长) 过去两天完成了哪些任务 对手写输入进行了重构,然后重新捋了一下bayes的思路 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还剩下哪些任务 组员:刘帅珍 过去两天完 ...
- Hibernate主键注解
http://www.cnblogs.com/hongten/archive/2011/07/20/2111773.html 版权声明:本文为博主原创文章,未经博主允许不得转载.
- HDU 4336 Card Collector 期望dp+状压
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4336 Card Collector Time Limit: 2000/1000 MS (Java/O ...
- DPDK网卡绑定
进入DPDK目录编译环境 # cd ~/DPDK/usertools # ./dpdk-setup.py 注意,setup脚本需要在root权限下运行,并且每次重启电脑,都需要重新插入模块和绑定网卡. ...
- HTTP&HTTPS、GET&POST
1.HTTP&HTTPS: HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure ...
- Internet History, Technology and Security (Week 5-2)
Week 5 (续) Layer 2: Internet Protocol The InterNetwork (IP) 老师强调了一下不用去记住他介绍的人所说的每句话,而是记住要点,了解老师所做的PP ...
- Reverse Words in a String II
Given an input string, reverse the string word by word. A word is defined as a sequence of non-space ...
- 基于JQuery的前端form表单操作
Jquery的前端表单操作: jquery提供了良好的方法封装,在一些基本的操作的时候,能节省很多的麻烦,其中,在具体使用时,form表单的数据提交是最频繁也最常见的前后数据交换方式,所以在前 ...
- DBGridEH序号的自动生成
序号的自动生成1.定义变量 private maxno:integer; public bmodified:boolean;2.写函数 function max(c ...
- avalon学习教程
最近在项目中发现了个很不错的前端MVVM框架 avalon,对于基础的使用大概学习了一遍,有些深入的没应用场景还没细看. 收藏好,估计以后要用 http://www.html-js.com/artic ...