node -v
npm install webpack
cd 对应的目录 //进入对应的目录
npm install webpack --save-dev
在终端直接执行webpack命令,使用的全局安装的webpack
当在package.json中定义了scripts时,其中包含了webpack命令,那么使用的是局部webpack
我们创建如下文件和文件夹:
文件和文件夹解析:
dist文件夹:用于存放之后打包的文件
src文件夹:用于存放我们写的源文件
index.html:浏览器打开展示的首页html
package.json:通过npm init生成的,npm包管理的文件(暂时没有用上,后面才会用上)
function add (num1,num2) {
return num1 + num2;
}
let a = 2;
module.exports = {
add,
a,
}
main.js文件中的代码:
//引入module模块
const {add,a} = require('./module');
console.log(add(2,3));
console.log(a);
webpack ./src/main.js ./dist/bundle.js
我们考虑一下,如果每次使用webpack的命令都需要写上入口和出口作为参数,就非常麻烦,有没有一种方法可以将这两个参数写到配置中,在运行时,直接读取呢?
当然可以,就是创建一个webpack.config.js文件(手动创建) 一定在根目录创建,结构如下
在这里首先要创建的就是文件的入口和出口,官网上解释的非常清楚戳链接去官网:
https://www.webpackjs.com/
入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。
每个依赖项随即被处理,最后输出到称之为 bundles 的文件中.
可以通过在 webpack 配置中配置 entry 属性,来指定一个入口起点(或多个入口起点)。默认值为 ./src。
output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。你可以通过在配置中指定一个 output 字段,来配置这些处理过程.
然后我们做一些简单的配置,如下:
const path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
}
};
配置完成之后就可以使用下面的命令开进行打包
webpack main.js(入口文件) bundle.js(出口文件)
npm install [email protected] --save-dev
在package.json中进行配置
在script脚本里添加"build" : "webpack"
即可
然后我们就可以通过命令来执行build指令
npm run build
通过npm run build
指令来代替webpack main.js bundle.js
loader是webpack中一个非常核心的概念。
webpack用来做什么呢?
在我们之前的实例中,我们主要是用webpack来处理我们写的js代码,并且webpack会自动处理js之间相关的依赖。
但是,在开发中我们不仅仅有基本的js代码处理,我们也需要加载css、图片,也包括一些高级的将ES6转成ES5代码,将TypeScript转成ES5代码,将scss、less转成css,将.jsx、.vue文件转成js文件等等。
对于webpack本身的能力来说,对于这些转化是不支持的。那怎么办呢?给webpack扩展对应的loader就可以啦。
loader使用过程:
项目开发过程中,我们必然需要添加很多的样式,而样式我们往往写到一个单独的文件中。
重新组织后页面的目录结构如下图所示:
index.css中的代码如下:
body {
background-color: #58a;
}
在入口文件处引用index.css
对整个文件进行重新打包(npm run build),会报如下错误信息:
这个错误告诉我们:加载index.css文件必须有合适的loader。
此时我们就可以进入webpack的官网,找到关于css-loader的使用方法
按照官方配置webpack.config.js文件
两个步骤:
下载命令
npm install css-loader --save-dev
配置的webpack.config.js文件如下:
const path = require('path');
module.exports = {
entry: './src/js/main.js',
output: {
path: path.resolve(__dirname, './dist'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.css$/,
use: [ 'css-loader' ]
}
]
}
};
在webpack官网中找到style-loader的使用发放,核心也是只有两点:
3. 安装loader
4. 配置webpack.json.js
下载命令
npm install style-loader --save-dev
配置的webpack.config.js文件如下:
const path = require('path');
module.exports = {
entry: './src/js/main.js',
output: {
path: path.resolve(__dirname, './dist'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.css$/,
use: [ 'css-loader' ]
}
]
}
};
配置完成之后重新打包项目(npm run build),打开index.html发现样式文件已经生效了.
注意:style-loader需要放在css-loader的前面。
疑惑:不对吧?按照我们的逻辑,在处理css文件过程中,应该是css-loader先加载css文件,再由style-loader来进行进一步的处理,为什么会将style-loader放在前面呢?
答案:这次因为webpack在读取使用的loader的过程中,是按照从右向左的顺序读取的。
如果我们希望在项目中使用less、scss、stylus来写样式,webpack是否可以帮助我们处理呢?我们这里以less为例,其他也是一样的。
我们还是先创建一个less文件,依然放在css文件夹中
创建的less文件的内容如下:
@fontSize : 40px;
@color : orange;
body {
font-size: @fontSize;
color : @color;
}
在main.js中引入less文件
//引入依赖的less文件
require('../css/special.less');
document.writeln('你好啊,webpack!
')
对文件进行打包(npm run build):
出现如上报错信息,需要我们安装响应的loader.
在webpack官网中找到less-loader的使用方法,介绍的很详细
npm install less-loader --save-dev less
我们先考虑在css样式中引用图片的情况,所以我更改了index.css中的样式:
body {
/* background-color: #58a; */
background-image: url(../img/pyc.jpg);
}
如果我们现在直接打包(npm run build),会出现如下问题:
npm install url-loader --save-dev
修改webpack.config.js配置文件,添加下面的规则:
{
test: /\.(png|jpg|gif)$/,
use: [{
loader: 'url-loader',
options: {
limit: 14336
}
}]
}
limit的默认值是8192,是8k的图片,但是我目前只有14k的图片,所以我修改limit的值为14336.
重新打包项目(npm run build)
打开index.html发现我们设置的背景图片已经生效了:
那么问题来了,如果大于limit呢?我们将background的图片改成pp.jpg
这次因为大于14kb的图片,会通过file-loader进行处理,但是我们的项目中并没有file-loader
npm install file-loader --save-dev
再次打包(npm run build),就会发现dist文件夹下多了一个图片文件
但是,我们发现图片并没有显示出来,这是因为图片使用的路径不正确
默认情况下,webpack会将生成的路径直接返回给使用者
但是,我们整个程序是打包在dist文件夹下的,所以这里我们需要在路径下再添加一个dist/
在webpack.json.js中添加如下语句:
重新打包项目(npm run build),发现样式文件已经生效了
但是我们就会发现新生成的图片名字非常我长的名
所以,我们可以在options中添加上如下选项:
重新打包文件后,图片的名字如下:
所以可以有如下的总结
使用webpack打包图片,可以设置一个limit的值,limit的默认值是8192,也就是8kb;
1. 当加载的图片小于limit时.会将图片编码为base64的字符串
2. 当加载的图片大于limit时,需要安装file-loader模块,且会给图片自动生成一个32位的hash值作为图片名,可以通过在option中配置name设置生成的图片名.
戳链接去官网
https://www.webpackjs.com/loaders/babel-loader/
安装:
npm install --save-dev babel-loader@7 babel-core babel-preset-es2015
配置webpack.config.js文件
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['es2015']
}
}
}
重新打包,查看bundle.js文件,发现其中的内容变成了ES5的语法