webpack
什么是前端模块化什么是webpack? 可以干嘛webpack全局安装:局部安装webpack:webpack的配置1,webpack - loader的使用1-1,使用webpack打包css文件 +less文件1-2,webpack处理图片1-3,webpack中ES6转ES5的babel
2,webpacl - plugin的使用2-1,什么是plugin2-2,plugin的使用2-2-1 webpacke中为打包文件添加版权声明2-2-2,webpack中用于打包html的plugin---HtmlWebpackPlugin2-2-3,webpack中用于打包js文件的plugin-ugilifyjs-webpack-plugin
3,loader和plugin的区别4,webpack搭建本地服务器5,webpack.config.js文件配置:[以上知识点的总结]补充:
什么是前端模块化
什么是webpack? 可以干嘛
webpack和grunt/gulp都可以用来打包静态资源,有什么区别?
webpacke除了对文件进行自动化打包,还提供模块化的编程方式。
webpack全局安装:
npm install webpack@3.6.0 -g
一旦项目中需要使用node,就可以进行一下npm初始化:npm init,会生成一个package.json文件–save-dev指的是开发时依赖。因为webpack的主要作用是打包,所以webpack属于开发时依赖。
局部安装webpack:
npm install webpack@3.6.0 --save-dev
通过node_modules/.bin/webpack启动webpack进行项目打包
在项目开发中,大多数浏览器都支持ES5,
对于es6【即es2015】可能不支持,所以在打包的时候,需要配置babel,
作用是将打包文件内的所有ES6语法转化成ES5语法
webpack的配置
1,webpack - loader的使用
1-1,使用webpack打包css文件 +less文件
需要npm intall --save-dev css-loader ,这个模块只负责加载,不负责解析style-loader才可以将导出的css模块添加到DOM。
npm install --save-dev style-loader
less-loader用来处理less文件。 使用前需要
npm install --save-dev less-loader
less
webpack中,use多个loader时,从右向左读取
{
test
:/\.css$/,
use
:['style-loader','css-loader','less-loader']
},
1-2,webpack处理图片
处理图片需要依赖url-loader模块包
npm install url-loader --save-dev
{
test
:/\.(png|jpg|jpeg|gif)$/,
use
:[{
loader
:'url-loader',
options
:{
limit
:13000,
name
: 'img/[name].[hash:8].[ext]'
}
}]
}
当加载的图片大小 < limit 时,会自动将图片编译成base64字符串形式当加载的图片 >limit 时,需要使用 file-loader 模块进行加载;所以webpack处理图片需要安装file-loader:
npm install file-loader --save-dev
使用file-loader加载的图片会自动打包进dist文件夹。这样会导致图片路径错误。 解决思路:加载图片时自动加上dist路径 具体操作,给 output 添加 publicPath 属性
publicPath
:'dist/'
通过file-loader自动打包的图片会自动命名未32位的hash。而我们通常希望图片命名有一定的规范,且图片全部打包进一个img文件夹而非全部打包在dist文件夹下。img/name.hash:8.ext 具体操作可以这样: 在options内添加name属性 希望自动打包的图片的命名方式有一定的规范,img/name.hash:8,而不是由file-loader自动命名为32位的hash
name
: 'img/[name].[hash:8].[ext]'
使用 [ ] 会将name当成变量
1-3,webpack中ES6转ES5的babel
如果需要将ES6的语法转ES5,就需要使用babel
为什么要转ES5??因为部分浏览器还不支持ES6webpack打包的js文件使用ES6语法,且没有转ES5。 所以在webpack中需要安装babel-loader
npm install babel-loader@7 babel-core babel-preset-es2015 --save-dev
配置webpack.config.js
module
.exports
={
module
:{
rules
:{
{
test
:/\.m?js$/,
exclude
:/(node_modules|bower_components)/,
use
:{
loader
:'babel-loader',
options
:{
presets
:['es2015']
}
},
}
}
}
2,webpacl - plugin的使用
2-1,什么是plugin
plugin是插件,webpack中的插件,就是对webpack现有功能的扩展。比如打包优化,文件压缩等。
2-2,plugin的使用
2-2-1 webpacke中为打包文件添加版权声明
BannerPlugin是webpack自带的插件。所以只要导入webpack-----require('webpack'),就能使用。
2-2-2,webpack中用于打包html的plugin—HtmlWebpackPlugin
HtmlWebpackPlugin的作用:
自动生成一个index.html文件【可以指定模板来生成】将打包的js文件,自动通过script标签插入到body
安装:
npm install html-webpack-plugin --save-dev
使用插件: 在webpack.config.js文件中
这里的template表示根据什么模板来生成index.html另外,需要删除之前在output中添加的publicPath属性,否则插入的script标签中的src可能会有问题使用之前需要导入:const htmlWebpackPlugin = require('html-webpack-plugin')
2-2-3,webpack中用于打包js文件的plugin-ugilifyjs-webpack-plugin
1,使用1.1.1版本和cli2保持一致
npm install uglifyjs-webpack-plugin@1.1.1 --save-dev
2,导入
const uglifyJsPlugin
= require('uglifyjs-webpack-plugin')
3,修改webpack.config.js文件。使用插件
3,loader和plugin的区别
4,webpack搭建本地服务器
webpack提供一个可选的本地开发服务器。可以让浏览器自动刷新显示我们修改后的结果。 使用之前需要先安装: 安装的版本和webpack版本需要有对应关系
npm install webpack-dev-server@2.9.1
5,webpack.config.js文件配置:[以上知识点的总结]
const path
= require('path')
const webpack
= require('webpack')
const HtmlWebpackPlugin
= require('html-webpack-plugin')
const uglifyJsPlugin
= require('uglifyjs-webpack-plugin')
module
.exports
= {
entry
:'',
output
:{
path
: path
.resolve(__dirname
,'dist'),
filename
:'bundle.js',
publicPath
:'dist/'
},
module
:{
reules
:{
{
test
:/\.css$/,
use
:['style-loader','css-loader','less-loader']
},
{
test
:/\.(png|jpg|jpeg|gif)$/,
use
:[{
loader
:'url-loader',
options
:{
limit
:13000,
name
: 'img/[name].[hash:8].[ext]'
}
}]
},
{
test
:/\.m?js$/,
exclude
:/(node_modules|bower_components)/,
use
:{
loader
:'babel-loader',
options
:{
presets
:['es2015']
}
}
},
}
},
resolve
:{
extensions
:['.js','.css','.vue'],
alias
:{
'vue$':'vue
/dist
/vue
.esm
.js"
}
},
plugins
:[
new webpack.BannerPlugin('最终版权归77所有'),
new HtmlWebpackPlugin({
template
:'index.html'
}),
new uglifyJsPlugin(),
],
devServer
:{
contentBase
:'./dist',
inline
:true
},
scripts
:{
"dev":"webpack-dev-server --open"
}
}
项目中使用的都是本地的webpack,所以即使安装了全局webpack,也需要安装本地webpack【全局webpack可以不安装,只安装本地的就行了 。因为项目中都使用本地的webpack】。
补充:
npm run 其实是映射webpack命令一旦项目中需要使用node中的依赖时,直接在项目根目录npm init执行 npm run serve / npm run dev / npm run build,都是映射到相关的webpack命令。只不过使用npm run 简化了命令复杂度。
vue 解析钩子 next()
单点登录,同时只允许一台电脑登录账号。