weback准确来说是一个模块打包方式,它能自动识别如ES modulu 、commonJS 、 AMD 、CMD这样的模块导出方式,但是对于高级的一些加载方式并不能识别。webpack在最初时只能打包js文件件,后来能打包css,less等文件
webpack的两种安装方式,全局安装
使用npm info webpack即可查询当前webpack的所有版本
在使用webpack加文件名时,此时使用的是webpack的默认配置文件,要想按照制定的内容进行打包,需要进行指定的配置
下面所举例的就是写的一个简单的配置文件中的内容
const path = require('path');
module.exports = {
mode: "production",
entry:{
main: "./src/index.js"
},
output: {
filename: 'buldle.js',
path: path.resolve(__dirname, 'dist')
}
}
在上面文件中需要做一下几点的说明,即上面配置文件中配置参数的说明
为什么会使用webpack-cli这个依赖包,该依赖包的作用是用于使得webpack这个命名能够在命令行使用
loader,翻译模板,对于webpack而言在没有配置时,默认打包的只能是js文件,如果想要去打包其他的文件形式,这里的其他文件形式包括less,sass,css等文件,就需要在webpack.config.js文件中去配置。
file-loader能够打包字体静态资源文件
这两个loader的作用是对于css文件进行模板翻译,翻译的时候需要这两个loader,其中css-loader的作用时查看多个css文件之间的关系,style-loader文件的作用是渲染样式在页面上,需要注意的是,这两者的顺序是不够颠倒的,在这个过程中满足从右到左,从下到上的原则,使用方式参照https://webpack.js.org/loaders/sass-loader/
作用:对于scss文件进行模板翻译,翻译的时候需要三个loader,从左到右分别为style-loader, css-loader ,sass-loader,表示的含义:先进行scss文件翻译,然后是css文件翻译,最后是渲染到页面上。与之类似的还有less-loader
对于loader的使用如同下面配置文件,在rules下增加loader,rules中存放的是数组,数组中存放的就是需要一个个对象,对象中test属性用于匹配文件,use表示使用何种规则
const path = require('path');
module.exports = {
mode: "production",
entry: {
main: "./src/index.js"
},
module: {
rules: [
{
test: /\.(png|jpg)$/,
use: [
{
loader: 'url-loader',
options: {
name: '[name]_[hash].[ext]',
outputPath: 'images',
limit: 40210 }
}
]
},{
test: /\.scss$/,
use: [
'style-loader',
{
loader: 'css-loader',
// options: {
// importLoaders: 2,
// modules: true
// }
},
'sass-loader'
]
},{
test: /\.(eot|ttf|woff|woff2)$/,
use:{
loader: 'file-loader'
}
}
]
},
output: {
filename: "[name].js",
path: path.resolve(__dirname, "dist")
}
}
对于plugin可以这样来理解,webpack在运行到某个时候,帮你做的一些事情。这就好比在vue或者是react中的生命周期函数一样,在组件加载在某个时刻就执行对应的生命周期函数
关于output与entry在上面已经说过了,在这里需要对entry的两个配置参数做说明
该参数表示生成的打包好的文件,可以在一个相同域名下的文件中,如: ‘http://cdn.com.cn’,则此时就需要在output中新增publicPath: ‘http://cdn.com.cn’,在这里需要注意下,使用该参数时不能乱用,否则会出现路径错误
对于webpack自动启动服务的方式有三种方式,如下所示
const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const webapck = require('webpack');
module.exports = {
mode: 'development',
devtool: 'cheap-module-eval-source-map',
entry: {
main: './src/index.js'
},
devServer: {
// contentBase: path.join(__dirname, 'dist'),
contentBase: './dist',
open: true,
proxy: {
'/api': "http://localhost:3000"
},
hot: true,
hotOnly: true
},
module: {
rules: [{
test: /\.css$/,
use:['style-loader','css-loader']
}]
},
plugins: [
new webapck.HotModuleReplacementPlugin(),
new CleanWebpackPlugin(),
new htmlWebpackPlugin({
template: 'src/index.html'
})],
output: {
publicPath: '/',
filename: '[name].js',
path: path.resolve(__dirname, 'dist/')
}
}
对于babel只需要知道的就是其能够将高级的es6及其es6以上的语法,转换为es5或者是es5一下的语法,这样做的原因是因为的一些浏览器对于这些高级语法不支持,只能支持低版本的语法
作为一个桥梁,将本地的js文件与babel库连接起来
是一个babel的核心库,里面是关于所有的js中es6部分转为es5中的核心内容
如果只是这种默认情况的话,用于es6转为es5的语法,对于es5中的有一些语法还是不能够被低版本的浏览器识别,如果要使得低版本的浏览器也能够识别就得使用Babel中的polyfill
其具体的使用方式如下:
该插件的作用与polyfill的作用类似,但其弥补了polyfill的缺点,当遇到类库或者是组件库的开发时,就可以使用这种方式来对项目进行开发,具体的使用方式如下:
对于webpack的基础大概就是这样,这些都是常用的loader、plugin以及babel。对于其他的一些内容可以去官网查询使用,引文webpack中的loader与plugin是非常的多,对于具体的应该场景需要不同的loader与plugin,这时就可以在网上的博客中去看或者是在一些群里问大佬,这样就能在实际中锻炼自己的webpack使用能力。这里加一个自己在用到上述内容时的github地址,在里面就是对于上面所说的配置的应用。https://github.com/whocareit/webpack,对于webpack中的一些其他高级应用,待自己学完后再总结。