学习vue的前置知识
1. NPM包管理工具
Node Package Manager
1.1 安装npm工具
http://nodejs.cn/download/
一路下一步下一步就行了
1.2 配置npm
cmd下 配置npm
npm config get registry
切换淘宝镜像
npx nrm use taobao
1.3 npm使用
查看包的版本
npm list
npm list -g
运行依赖和开发依赖
npm install -save xxx
npm install -save-dev xxx
1.4 package.json
初始化package.json
npm init
npm init --yes
package.json中包的版本
"^3.x.x" x会是最新的小版本
"~3.1.x" x会是最新的小版本
"3.1.2" 就是这个
1.5 ES语法转换工具
安装babel
npm install --save-dev babel-cli
配置bable
{
"presets":["es2015","stage-2"],//设置转码规则
"plugins":["transform-runtime"]//设置插件
}
安装需要的库
npm install babel-core babel-preset-es2015 babel-plugin-transform-runtime babel-preset-stage-2 --save-dev
再配置package.json
在根目录下创建lib和src文件夹
"scripts":{"build":"babel src -w -d lib"}
编译转换
npm run build
1.6 yarn
安装
npm install -g yarn
检查
tarn --version
基本使用
1.7 npm与yarn对比
npm是同步安装
yarn是异步安装
npm5之后其实也没有太大区别
2. Webpack
webpack是一个模块打包器(构建工具)。它的主要目标是将JavaScript文件打包在一起,打包后的文件用于在浏览器中使用,但它也能够胜任转换(transform)、打包(bundle)或包裹(package)任何资源(resource or asset)。
2.1 打包原理
树结构:在一个入口文件中引入所有资源,形成所有依赖关系树状图
模块:模块就是模块可以是ES6模块也可以是commonJS或者AMD模块,对于webpack来说,所有的资源(css.img.….)
chunk:打包过程中被操作的模块文件叫做chunk,例如异步加载一个模块就是一个chunk
bundel: bundle是最后打包后的文件,最终文件可以和chunk长的一模一样,;但是大部分情况下他是多个chunk的集合
2.2 安装webpack
npm初始化
npm init -y
安装webpack和脚手架 -D是开发环境
npm i webpack webpack-cli -D
简单打包
webpack --mode development
webpack --mode production
2.3 webpack.config.js核心配置
在根目录下创建webpack.config.js文件,不一定要叫做webpack.config.js,但它是默认的,打包时方便
//拼路径
const {resolve} = require('path');
module.exports = {
//webpack配置
entry:'./src/index.js',
output:{
filename:"build.js",
path:resolve(__dirname,"build")
},
//loder配置
module:{
rules:[
]
},
//plugin配置
plugin:{
},
mode:"development"//production
}
2.4 entry
单入单出
entry: './src/index.js'
多如单出
entry:["./src/index.js","./src/a.js"]
多如多出 Object
entry:{
one:'./src/index.js',
two:'./src/a.js'
}
特殊 分情况多如多出
entry:{
one:["./src/index.js","./src/a.js"],
two:'./src/main.js'
}
2.5 打包压缩html资源
安装插件
npm i html-webpack-plugin -D
配置webpack.config.js文件
//拼路径
const {resolve} = require('path');
//引入方法
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
//webpack配置
entry:'./src/index.js',
output:{
filename:"build.js",
path:resolve(__dirname,"build")
},
//loder配置
module:{
rules:[
]
},
//plugin配置
plugin:{
new HtmlWebpackPlugin({
template:"./src/demo.html",
filename:"demo.html"
//压缩html代码
minify: {
//移除空格
collapseWhitespace:true,
//移除注释
removeComments:true
}
})
},
mode:"development"//production
}
webpack打包多html开发案例
注意,打包顺序是从右往左的 chunks: [“index” , “vendor”],
//多个entry
entry: {
vendor: ['jquery' ,'./src/js/common.js'],
index: "./src/js/index.js",
cart: "./src/js/cart.js"
},
//负责打包html文件将js注入到html中',minify压缩html
new HtmlWebpackPlugin({
filename: "index.html",
template: "./src/index.html",
//注意,打包顺序是从右往左的
chunks: ["index" , "vendor"],
minify:{
removeComment:true,
collapseWhitespace:true
}
}),
new HtmlWebpackPlugin({
filename: "cart.html",
template: "./src/cart.html",
chunks: ["cart" ,"vendor"]
}),
2.6 打包css资源
安装loder
css-loader作用是将css放入js中
style-loader作用是将css放入html中
npm i css-loader style-loader -D
配置webpack.config.js文件
//loder配置
module:{
rules:[
{
test:/\.css$/,
use:['style-loader','css-loader']//从右到左,从上到下
}
]
},
目录结构
index.js
require('./style.css');
2.6.1 打包less和sass资源
安装
npm i less less-loader -D
npm i node-sass sass-loader -D
配置webpack.config.js文件
注意就是scss(/.scss$/)
//loder配置
module:{
rules:[
{ test:/\.css$/,use:['style-loader','css-loader'] },//从右到左,从上到下
{ test:/\.less$/,use:['style-loader','css-loader','less-loader'] },//从右到左,从上到下
{ test:/\.scss$/,use:['style-loader','css-loader','sass-loader'] }//从右到左,从上到下
]
},
index.js
require( ' ./style.css');
require( './ lessstyleless ')
require( './stylesass.scss ')
目录结构
2.6.2 提取单独的css文件
安装插件
npm i mini-css-extract-plugin -D
引入和使用插件
//拼路径
const {resolve} = require('path');
//引入方法
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
//webpack配置
entry:'./src/index.js',
output:{
filename:"build.js",
path:resolve(__dirname,"build")
},
//loder配置
module:{
rules:[
//{ test:/\.css$/,use:['style-loader','css-loader'] },//从右到左,从上到下
//会合并成一个文件
{ test:/\.css$/,use:['MiniCssExtractPlugin.loader','css-loader'] },//换成独立的文件
{ test:/\.less$/,use:['MiniCssExtractPlugin.loader','css-loader','less-loader'] },//从右到左,从上到下
{ test:/\.scss$/,use:['MiniCssExtractPlugin.loader','css-loader','sass-loader'] }//从右到左,从上到下
]
},
//plugin配置
plugin:{
new HtmlWebpackPlugin({
template:"./src/demo.html",
filename:"demo.html"
}),
MiniCssExtractPlugin({
filename:'demo.css',//指定文件名称
})
})
},
mode:"development"//production
}
2.6.3 处理css兼容性
使用的流程:
webpack.config.js文件(postcss-loader) -> postcss.config.js文件 -> package.json(查看需要适配哪些浏览器)->webpack(打包)
安装
npm i post-loader postcss-preset-env -D
创建postcss.config.js文件 引入插件
module.exports = {
plugins: [
require('postcss-preset-env')()
]
}
配置webpack.config.js文件
//拼路径
const {resolve} = require('path');
//引入方法
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
//webpack配置
entry:'./src/index.js',
output:{
filename:"build.js",
path:resolve(__dirname,"build")
},
//loder配置
module:{
rules:[
//{ test:/\.css$/,use:['style-loader','css-loader'] },//从右到左,从上到下
//会合并成一个文件
//{ test:/\.css$/,use:['MiniCssExtractPlugin.loader','css-loader'] },//换成独立的文件
{ test:/\.css$/,use:['MiniCssExtractPlugin.loader','postcss-loader'] },//换成独立的文件
{ test:/\.less$/,use:['MiniCssExtractPlugin.loader','css-loader','less-loader','postcss-loader'] },//从右到左,从上到下
{ test:/\.scss$/,use:['MiniCssExtractPlugin.loader','css-loader','sass-loader','postcss-loader'] }//从右到左,从上到下
]
},
//plugin配置
plugin:{
new HtmlWebpackPlugin({
template:"./src/demo.html",
filename:"demo.html"
}),
MiniCssExtractPlugin({
filename:'demo.css',//指定文件名称
}),
})
},
mode:"development"//production
}
package.json指定适配的浏览器
"browserslist": [
"last 1 version",
"> 0.2%",
"maintained node versions",
"not dead"
]
2.6.4 压缩css
安装
npm i optimize-css-assets-webpack-plugin -D
配置webpack.config.js文件
//拼路径
const {resolve} = require('path');
//引入方法
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
module.exports = {
//webpack配置
entry:'./src/index.js',
output:{
filename:"build.js",
path:resolve(__dirname,"build")
},
//loder配置
module:{
rules:[
//{ test:/\.css$/,use:['style-loader','css-loader'] },//从右到左,从上到下
//会合并成一个文件
//{ test:/\.css$/,use:['MiniCssExtractPlugin.loader','css-loader'] },//换成独立的文件
{ test:/\.css$/,use:['MiniCssExtractPlugin.loader','postcss-loader'] },//换成独立的文件
{ test:/\.less$/,use:['MiniCssExtractPlugin.loader','css-loader','less-loader','postcss-loader'] },//从右到左,从上到下
{ test:/\.scss$/,use:['MiniCssExtractPlugin.loader','css-loader','sass-loader','postcss-loader'] }//从右到左,从上到下
]
},
//plugin配置
plugin:{
new HtmlWebpackPlugin({
template:"./src/demo.html",
filename:"demo.html"
}),
MiniCssExtractPlugin({
filename:'demo.css',//指定文件名称
}),
//一般上线才压缩
//new OptimizeCssAssetsWebpackPlugin(),
})
},
mode:"development"//production
}
2.6.5 打包图片资源
安装
npm i url-loader file-loader html-loader -D
css中的图片处理
{
test:/\.(png|svg|jpg|gif)$/,//图片类型
loader: 'url-loader',
options:{
publicPath:'./images/', //位置
outputPath:'images/', //输出位置
limit:1024 * 8, //需要做base64编码的图片大小限制
name:'[name][hash:10].[ext]',//图片名称
}
}
html中的图片处理
{
test:/\.(html)$/,//图片类型
loader: 'html-loader',
}
2.6.6 其他资源和字体图标资源
资源 https://www.iconfont.cn/
{
exclude: /\.(jsljson|html|css|less|scss|png|gif|jpg|jpeg)$/,
loader: 'file-loader ',
options: {
outputPath: 'font/ ',
publicPath: './font',
}
}
2.6.7 publicPath与outputPath区别
- publicPath是指引用路径,outputPath是指输出路径
- 输出路径是指在本地打包后具体在dist下的文件位置
- 引用路径是指打包后设置对静态资源引用的位置
2.7 上线配置
安装取出多余css插件
npm i purgecss-webpack-plugin -D
新增配置webpack.js
//拼路径
const {resolve,join} = require('path');
const PurgecssPlugin = require('purgecss-webpack-plugin');
const glob = require('glob');
const PATHS = { src: join(__dirname,'src') }
plugin:{
new HtmlWebpackPlugin({
template:"./src/demo.html",
filename:"demo.html"
}),
MiniCssExtractPlugin({
filename:'demo.css',//指定文件名称
}),
//一般上线才压缩
//new OptimizeCssAssetsWebpackPlugin(),
new PurgecssWebpackPlugin({
paths: glob.sync(`${PATHS.src}/**/*`,{ nodir:true }),
}),
})
2.8 代码规范
安装检查规则工具eslint
npm i eslint-loader eslint eslint-config-airbnb-base eslint-plugin-import -D
新增配置package.json
"eslintConfig":{
"extends":"airbnb-base"
}
新增配置webpack.js
{
test:/\.js$/,
exclude:'/node_moudles/',
loader: 'eslint-loader',
options:{
fix:true
}
}
会提示console打印的warning,因为上线后不太需要,当然可以以不让它警告
//eslint-disable-next-line
console.log("xxx");
2.9 开发服务器devServer
安装
npm i webpack-dev-server -D
配置webpack.config.js
target: "web",
devServer:{
port:8888, //自订端口
compress:true, //自动编译
open:true,
hot:true,//热更新
}
配置package.json文件
"script":{
"dev":"webpack serve --mode development --port 8888",
"build":"webpakc --mode production"
}
启动
npm run build
npm run dev
最后总结
Vue和React也是使用了webpack这些功能