webpack4打包基础篇

70 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

webpack4 模块打包工具

npx webpack index.js 打包命令pm

 

全局安装webapack

npm install webpack webpack-cli -g

webpack -v

npm uninstall webpack webpack-cli -g

 

局部安装

npm install webpack webpack-cli --save-dev //-D

webpack -v //command not found 默认在全局环境中查找

npx webpack -v //npx帮助我们在项目中的node_modules里查找webpack

 

安装指定版本

npm info webpack //查看webpack的历史发布信息

npm install webpack@x.xx webpack-cli -D

 

配置文件webpack.config.js

npx webpack --config webpackconfig.js //指定webpack使用webpackconfig.js文件作为配置文件来执行

"scripts": {

"bundle": "webpack"//这个地方不要添加npx, 因为npm run 执行的命令,会有限使用项目工程里的包,效果和npx类似

}

 

核心概念

entry:入口文件

output:出口文件(打包后的文件位置)

loader:(执行顺序:从右到左,从上到下)webpack默认只知道如何处理js模块,其他格式的模块处理,和处理方式就需要loader

file-loader 静态资源模块npm install file-loader -D

url-loader jpg的模块转换成base64格式的字符串

postcss-loader 添加前缀

 

plugin

HtmlWebpackPlugin 自动生成html文件

clean-webpack-plugin 打包之前先清空dist目录

 

sourceMap 源代码与打包后的代码的映射关系

devtool:"none" eval速度最快 cheap

 

开发环境推荐

devtool: "chrap-module-eval-source-map"

 

线上环境

devtool: "chrap-module-source-map"

 

WebpackDevServer

npm install webpack-dev-server -D

 

"scripts": {

"server": "webpack-dev-server"

}

 

devServer: {

contentBase: "./dist",

open: true,

hot: true,

//

hotOnly: true,

port: 8081,

proxy: {

"/api": {

target: "http://localhost: 9092"

}

}

}

 

axios.get("/api/info").then(res => {

console.log(res)

})

 

处理js模块HRM热更新

需要使用module.hot.accept来观察模块更新,从而更新

 


const webpack = require("webpack");

new webpack.HotModuleReplacementPlugin()

 
if(module.hot) {

    module.hot.accept("./b", function() {

    number();

    })

}

 

Babel处理ES6

npm i babel-loader @babel/core @babel/preset-env -D

 

@babel/profill

把es的新特性都装进来,来弥补低版本浏览器中缺失的特性: 以全局的方式注入进来,windows,Promise,会造成全局对象的污染

打包体积大使用 useBuiltIns: "usage"//按需注入

 

@babel/plugin-transform-runtime

@bbabel/runtime

开发组件库,工具库,使用闭包的方式

 

 

配置React打包环境

npm install react react-dom --save

//安装babel与react转换的插件

npm install --save-dev @babel/preset-react

//在babelrc文件里添加

@babel/preset-react

 

tree Shaking只支持ES module的引入方式

 

optimization: {

usedExports: true

}

 

//package.json

"sideEffects": false 正常对所有模块进行 tree shaking或者

"sideEffects": ['*.css',@babel/profill]

 

development vs Production模块区分打包

 

npm install webpack-merge -D

 

//package.json

"scripts": {

"dev":"webpack-dev-server --config ./build/webpack.dev.js"

"build":"webpack --config ./build/webpack.prod.js"

}

 

//外部传入的全局变量

var merge = require("webpack-merge");

    module.exports = (env) => {

        if(env && env.production) {

            return merge(commentConfig, prodConfig);

        } else {

            return merge(commonConfig, devConfig)

        }

}

//外部传入变量

scripts: " --env.production"

 

代码分割

optimization: {

    splitChunks: {

    chunks: "all" //默认是支持异步async

    }

}