使用 webpack 作为前端构建工具
TypeScript编译成Javascript,SCSS编译成Css等JavaScript、Css、Html代码 压缩合并图片等在 webpack 应用中有两个核心
npm init -y
npm i webpack webpack-cli --save-devnpm -S 是--save的缩写 是生产
npm -D 是--save-dev的缩写 是开发
webpack-cli的目的是解析用户传递一些参数给 webpack 打包
commonJs 规范是 Nodewebpack 的时候是装的开发环境 直接 webpack 是找不到的,可以使用 npx (这个命令是 npm 5.2) 之后出来的 npx 是默认找 node_modules 中的.bin 目录下的文件 npx webpack开发环境 生产环境 npx webpack --mode development 开发环境不会被压缩为了方便也可以这么写,使用 npm run 命令这个命令执行的时候默认会把 node_modules 的.bin 文件放到全局上,执行之后销毁npm run buildnpm run dev
"scripts": {
"build":"webpack --mode production",
"},webpack.config.js webpack.file.js默认导出的是配置文件
module.exports={ //入口 entry:path.resolve(__dirname,'./src/index.js'), //写路径都采用绝对路径 }module.exports={ output:{ filename:"bundle.js", path:path.resolve(__dirname,"dist"); } }module.exports = { mode: "development" //当前是开发模式 }"scripts": { "build": "webpack", "dev":"webpack" }, //- 变量的形式webpack.config.js
module.exports = (env)=>{ //env 环境变量 console.log("mode",env) //函数要返回配置文件,没返回会采用默认配置 }package.json
"scripts": { "build": "webpack --env.production", "dev":"webpack --env.development" },为了区分开发模式和生产模式 会新建一个 build 文件 新建一个基础配置 webpack.base.js
webpack.base.js webpack.dev.js webpack.prod.js通过--config 指定执行的文件是哪一个。
"scripts": {
"build": "webpack --env.production --config ./build/webpack.base.js",
"dev": "webpack --env.development --config ./build/webpack.base.js"
},npm i webpack-merge --save-devif(isDev){
return merge(base,dev)
}else{
return merge(base,prod)
}如果是开发环境,要使用 webpack-dev-server
npm i webpack-dev-server --save-devwebpack-dev-server 是在内存中打包的不会产生实体
"scripts": {
"build": "webpack --env.production --config ./build/webpack.base.js",
"dev": "webpack-dev-server --env.development --config ./build/webpack.base.js"
},module.exports={
mode:"development",
devServer:{ //开发服务的配置
port:3000,
compress:true, //gzip 可以提升返回页面的速度
contentBase:path.resolve(__dirname,'../dist') //webpack启动服务会在dist目录下
}
}npm i html-webpack-plugin --save-dev在根文件下创建 public 文件夹
plugins:[
new HtmlWebpackPlugin({
template:path.resolve(__dirname,'../public/index.html'),
filename:"index.html",
minify:!isDev&&{
removeAttributeQuotes:true, //去掉双引号
collapseWhitespace:true //去掉空格
}
})
]npm i clean-webpack-plugin --save-dev //每次打包先清空dist文件夹
new CleanWebpackPlugin({
cleanOnceBeforeBuildPatterns: ['**/*'] //打包之前清空目录 默认是这个配置 所有目录下的所有文件
}),先解析 css
// index.js
import './index.css'
//引入css1.
loader的执行顺序 默认从下往上执行 从右往左执行2.
css-loader会解析 css 语法style-loader会将解析的 css 变成 style 标签插入到页面中3.解析 css 需要两个
css-loaderstyle-loader
npm i css-loader style-loader --save-dev转化什么文件 用什么去转 使用那些loader
loader写法 可以是[] 也可以是{}也可以是""
rules:[
{
test:/\.css$/,
use:['style-loader','css-loader']
},
]预处理器
scssnode-sasssass-loader
npm i node-sass sass-loader --save-dev匹配到scss结尾的文件使用sass-loader来调用node-sass处理sass文件
{
test:/\.scss$/,
use:['style-loader','css-loader','sass-loader']
}
lessless-loader
stylusstylus-loader
如果 css 里引入了 scss 文件
rules:[
{
test:/\.css$/,
use:['style-loader',{
loader:'css-loader',
options:{
importLoaders:1
}
},'sass-loader']
},
]npm i postcss-loader --save-dev
npm i autoprefixer --save-dev需要一个配置文件 post.config.js
module.exports={
plugins:[
require("autoprefixer")
]
}创建一个.browserslistrc 文件
cover 95%mini-css-extract-plugin 需要把 css 抽离npm i mini-css-extract-plugin --save-devnew MiniCssExtractPlugin({ //如果是开发模式就不要用抽离样式的插件
filename:"css/main.css"
}){
test: /\.css$/,
use: [
isDev?'style-loader':MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
importLoaders: 2
}
}, 'postcss-loader', 'sass-loader']
}webpack.prod.js
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const TerserJSPlugin = require('terser-webpack-plugin');
module.exports={
mode:"production",
optimization: { //优化项
minimizer:[ //可以放置压缩方案
new OptimizeCSSAssetsPlugin(), //用了这个 js也得手动压缩
new TerserJSPlugin()
]
},
} npm i file-loader --save-dev
npm i url-loader --save-dev{
test:/\.(woff|ttf|eot|svg)/,
use:"file-loader"
},
{
test: /\.(jpe?g|png|gif|jpg)$/,
use: {
loader: "url-loader",
//如果大于100k的图片继续使用file-loader
options: {
name: 'image/[contentHash].[ext]',
limit: 100 * 1024
}
}
//file-loader 默认的功能是拷贝的功能
//我希望是当前比较小的转化成base64 比以前大 好处就是不用发http请求
}es6 转 es5 但是有些 api 不是 es6 语法比如装饰器 类的属性总结:默认会调用
@babel/core来转化代码 转化的时候用@babel/preset-env将 es6 转化成 es5
{ //解析js文件 调用@babel/core
test:/\.js$/,
use:"babel-loader"
},.babelrc文件默认是 options 的配置{
"presets:[
"@babel/preset-env" //从下到上执行 这个是插件包
],
"plugins":[ //从上到下执行 这个是单个插件
]
}npm i @babel/plugin-proposal-class-properties -D"plugins":[ //从上到下执行
["@babel/plugin-proposal-class-properties",{"loose":true}]
]loose:true 表示宽松 this.a=1loose:false Object.definedProperty解析装饰器
npm i @babel/plugin-proposal-decorators --save-dev@babel/plugin-proposal-class-properties 上面执行"plugins":[ //从上到下执行
["@babel/plugin-proposal-decorators",{"legacy":true}],
["@babel/plugin-proposal-class-properties",{"loose":true}]
]"presets":[
["@babel/preset-env",{
"usageBuitIns":"usage" //按需加载
}] //从下到上执行
],npm install --save-dev @babel/plugin-transform-runtime
npm install --save @babel/runtimenpm i @babel/preset-react --save-devts-loader 使用 typescript 库npm i typescript
npx typescript -init 生成一个typescript文件vue.shims.d.tsdeclare module "*.vue"{
import Vue from "vue";
export default Vue
}npm i vue-loader vue-template-compiler -D{
test:/\.vue$/,
use:"vue-loader"
},
const VueLoaderPlugin = require("vue-loader/lib/plugin");
new VueLoaderPlugin(),vue 写 tsnpm i vue-property-decorator --save-dev["@babel/preset-typescript",{
"allExtensions":true
}]了解了上面的这些webpack,基本上就可以搭建我们的开发环境了,本文结束,有什么问题和有错误的地方,欢迎大家的留言和评论,还有后续更新,下期更加精彩