webpack
是一个现代的JavaScript应用的静态模块打包工具
.
webpack核心
:
模块化开发
,webpack扩展
对应的loader
。要加载css、图片,也包括一些高级的将ES6转成ES5代码,将TypeScript转成ES5代码,将scss、less转成css,将.jsx、.vue文件转成js文件等等转换成可以在浏览器上运行的代码。 runt/gulp
更加强调的是前端流程的自动化
,模块化不是它的核心。
webpack
更加强调模块化开发管理
,而文件压缩合并、预处理等功能,是他附带的功能
。
webpack
为了可以正常运行必须依赖node环境
,node环境为了正常执行很多代码,必须其中各种依赖的包工具。
下载node软件并安装,下载地址 选择自己电脑相应的版本,然后点击下一步下一步安装就行。
安装命令,打开cmd并输入npm i webpack -g
我的文件目录如下:先暂时用bbb.js
代替main.js(入口)
要想把我们所写的模块化静态资源打包成我们引入的静态资源,我们打开cmd
并找到我们当前写的文件所在的目录
。输入 webpack 打包文件的目录 打包到的文件目录
打开我们写的文件所在的cmd
npm init
初始化nodenpm i [email protected] --Save-dev
下载开发时依赖的webpackwebpack.config.js 基本的路径配置
如下
注意:此时我们在终端直接输入webpack
就可以运行文件
了,但是我们此时运行的是全局的webpack
,一旦我们的项目拷贝给其他人,可能会出现问题,因为一个项目往往依赖特定的 webpack 版本,全局的版本可能很这个项目的 webpack 版本不一致,导出打包出现问题。因此通常一个项目,都有自己局部的webpack,所以我们还需要对其package.json配置。
给webpack扩展
对应的loader
。loader主要用于转换某些类型的模块,它是一个转换器。转换css、图片,也包括一些高级的将ES6转成ES5代码,将TypeScript转成ES5代码,将scss、less转成css,将.jsx、.vue文件转成js文件等等转换成可以在浏览器上运行的代码。更多详情请点击
npm install --save-dev css-loader
npm install --save-dev style-loader
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [ 'style-loader', 'css-loader' ]
}
]
}
}
安装命令npm install --save-dev url-loader
module: {
rules: [{
//css-loader只负责将css文件进行加载
//ts-loader负责将样式添加到DOM中
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
]
}
这里的错误时由于limit的限制导致
的,当加载的图片,大于limit时,需要使用file-loader模块进行加载,所以我们还需要安装npm install --save-dev file-loader
此时我们去运行文件时,还会报错,错误如下
这里报错是因为我的webpack版本是3.6.0
,但是file-loader版本是6.2.0
,因为我们需要安装旧版本file-loader
。比如我安装的就是npm install [email protected] --save-dev
要想解决这个问题,我们必须必须去配置webpack.config.js中图片的路径
,在url的配置对象中加入如下代码
name: 'img/[name].[hash:8].[ext]'
img
:文件夹[name]
:name变量,即原来图片的名字[hash:8]
:8位数的哈希值,为了确保图片命名不重复[ext]
:图片继承的类型,即图片的扩展名注意:这里还有一个问题,就是我们img的存放位置也变了,所以我们还需要配置webpack.config.js中出口的路径
publicPath: 'dist/' //涉及到url的时候,都会自动给其加上对应的路径
完整的配置如下:
const path = require('path')
module.exports = {
entry: './src/main.js', //打包文件的入口文件
output: {
//打包到的文件路径
//dirname是node提供的全局变量,保存当前文件所在路径
path: path.resolve(__dirname, 'dist'), //打包到的文件路径,注意这里是绝对路径。
filename: 'bundle.js', //打包到的文件名
publicPath: 'dist/' //涉及到url的时候,都会自动给其加上对应的路径
},
module: {
rules: [{
test: /\.(png|jpg|gif|jpeg)$/,
use: [{
loader: 'url-loader',
options: {
//当加载的图片,小于limit时,会将图片编译成base64字符串形式
//当加载的图片,大于limit时,需要使用file-loader模块进行加载
limit: 8192,
name: 'img/[name].[hash:8].[ext]'
}
}]
}
]
}
}
如果希望将ES6的语法转成ES5,那么就需要使用babel。而在webpack中,我们直接使用babel对应的loader就可以了。即打开 cmd 输入 npm install --save-dev babel-loader@7 babel-core babel-preset-es2015
module: {
rules: [{
test: /\.js$/,
// exclude: 排除
// include: 包含
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['es2015']
}
}
}
]
}
webpack 中的插件,就是对webpack现有功能的各种扩展,比如打包优化,文件压缩等等。
plugin的使用过程:
添加版权名字叫BannerPlugin
—webpack自带的插件
。但我需要配置 webpack.config.js
plugins: [
new webpack.BannerPlugin('最终版权归君莫笑所有')
]
在真实发布项目时,发布的是dist文件夹中的内容,但是dist文件夹中如果没有index.html文件,那么打包的js等文件也就没有意义了。这个时候就可以使用 HtmlWebpackPlugin
插件。该插件可以帮我们完成以下事情:
npm install html-webpack-plugin --save-dev
配置 webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin')
plugins: [
new htmlWebpackPlugin({
template: 'index.html'
})
]
去掉js的空格、回车、换行之类的确保我们的js所占空间更小
安装第三方的插件uglifyjs-webpack-plugin,并且版本号指定1.1.1,和CLI2保持一致
npm install [email protected] --save-dev
配置 webpack.config.js
const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')
plugins: [
new UglifyjsWebpackPlugin()
]
webpack提供了一个可选的本地开发服务器,这个本地服务器基于node.js搭建,内部使用express框架,可以实现我们想要的让浏览器自动刷新显示我们修改后的结果。
npm install --save-dev [email protected]
devServer: {
contentBase: './dist',
inline: true
}
contentBase
:为哪一个文件夹提供本地服务,默认是根文件夹,我们这里要填写./distport
:端口号inline
:页面实时刷新historyApiFallback
:在SPA页面中,依赖HTML5的history模式配置:package.json 中的 "scripts"
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"dev": "webpack-dev-server --open"
},
其中:build代表最后打包的命令,dev代表开发时的命令(–open表示自动打开)
const HtmlWebpackPlugin = require('html-webpack-plugin') //打包html
const path = require('path')
const webpack = require('webpack')
const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin') //压缩js
module.exports = {
//出口
entry: './src/main.js', //打包文件的入口文件
//入口
output: {
//打包到的文件路径
//dirname是node提供的全局变量,保存当前文件所在路径
path: path.resolve(__dirname, 'dist'), //打包到的文件路径,注意这里是绝对路径。
filename: 'bundle.js', //打包到的文件名
// publicPath: 'dist/'
},
//loader加载
module: {
rules: [{
//css-loader只负责将css文件进行加载
//ts-loader负责将样式添加到DOM中
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.(png|jpg|gif|jpeg)$/,
use: [{
loader: 'url-loader',
options: {
//当加载的图片,小于limit时,会将图片编译成base64字符串形式
//当加载的图片,大于limit时,需要使用file-loader模块进行加载
limit: 8192,
name: 'img/[name].[hash:8].[ext]'
}
}]
}, {
test: /\.js$/,
// exclude: 排除
// include: 包含
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['es2015']
}
}
}
]
},
//插件
plugins: [
new webpack.BannerPlugin('最终版权归aaa所有'),
new HtmlWebpackPlugin({
template: 'index.html'
}),
new UglifyjsWebpackPlugin()
],
//服务器
devServer: {
contentBase: './dist',
inline: true
}
}
{
"name": "webpack",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"dependencies": {
"css-loader": "^3.6.0",
"style-loader": "^2.0.0",
"webpack": "^3.6.0"
},
"devDependencies": {
"babel-core": "^6.26.3",
"babel-loader": "^7.1.5",
"babel-preset-es2015": "^6.24.1",
"file-loader": "^4.0.0",
"html-webpack-plugin": "^3.2.0",
"uglifyjs-webpack-plugin": "^1.1.1",
"url-loader": "^4.1.1",
"webpack-dev-server": "^2.11.5"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"dev": "webpack-dev-server --open"
},
"author": "君莫笑",
"license": "ISC"
}