从零配置webpack(react+less+typescript+mobx)
本文目标
从零搭建出一套支持react+less+typescript+mobx的webpack配置
最简化webpack配置
首页要初始化yarn和安装webpack的依赖
yarn init -yyarn add webpack webpack-cli -D
根目录下新建webpack.config.js文件,内容如下
const path = require('path');module.exports = {
mode: 'development',
// 入口 这里应用程序开始执行
entry: path.resolve(__dirname, 'src/index.tsx'),
// 出口
output: {
// 输出文件的目标路径
path: path.resolve(__dirname, 'dist'),
// 输出的文件名
filename: 'bundle.js',
// 输出解析文件的目录。静态资源最终访问路径 = output.publicPath + 资源loader或插件等配置路径
publicPath: '/'
}
}
使用命令进行打包
webpack --mode production
另外亦可以将命令配置到 package.json 中的 scripts 字段
"scripts": {"build": "webpack --mode production"
},
执行命令 yarn build 即可打包
使用模版html
html-webpack-plugin 插件 可以指定template模板文件,将会在output目录下,生成html文件,并引入打包后的js.
安装依赖
yarn add html-webpack-plugin -D
在webpack.config.js增加plugins配置
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {
//...other code
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, 'src/index.html')
})
]
}
html-webpack-plugin 插件 还支持title、minify、filename等其他参数
配置webpack-dev-server
webpack-dev-server提供了一个简单的Web服务器和实时热更新的能力,有助于开发。
安装依赖
yarn add webpack-dev-server -D
在webpack.config.js中增加devServer配置
const path = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
//...other code
devServer: {
hot: true,
port: 3000,
open: true,
contentBase: path.resolve(__dirname, 'dist'),
// 开发模式下写/就行啦
publicPath: '/',
}
}
在 package.json 的 scripts 字段中增加 start模式
"scripts": {"start": "webpack-dev-server --mode development",
"build": "webpack --mode production"
},
这样我们就可以通过yarn start来启动服务啦
官网devServer
链接Webpack中publicPath详解
支持加载css文件
通过使用不同的 style-loader 和 css-loader, 可以将 css 文件转换成js 文件类型。
安装依赖
yarn add style-loader css-loader -D
在webpack.config.js中增加loader配置
module.exports = {//other code
module: {
rules: [
{
test: /\.css/,
use: ['style-loader', 'css-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
}
]
}
}
loader 可以配置以下参数:
- test: 匹配处理文件的扩展名的正则表达式
- use: loader名称
- include/exclude: 手动指定必须处理的文件夹或屏蔽不需要处理的文件夹
- query: 为loader提供额外的设置选项
支持图片加载
需要引入两个loader
- file-loader: 解决CSS等文件中的引入图片路径问题
- url-loader: 当图片小于limit的时候会把图片Base64编码,大于limit参数的时候还是使用file-loader进行拷贝
如果希望图片存放在单独的目录下,那么需要指定outputPath
安装依赖
yarn add url-loader file-loader -D
在 webpack.config.js 中增加 loader 的配置(增加在 module.rules 的数组中)。
module.exports = {//other code
module: {
rules: [
{
test: /\.(gif|jpg|png|bmp|eot|woff|woff2|ttf|svg)/,
use: [
{
loader: 'url-loader',
options: {
limit: 8192,
outputPath: 'images'
}
}
]
}
]
}
}
支持编译less
很多前端都喜欢写less,所以支持less也是需要的。(sass配置方法基本相同)
安装依赖
yarn add less less-loader -D
在 webpack.config.js 中增加 loader 的配置(module.rules 数组中)。
module.exports = {//other code
module: {
rules: [
{
test: /\.less/,
use: ['style-loader', 'css-loader', 'less-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
]
}
}
支持转义 ES6/ES7/JSX(react)
安装ES6/ES7/JSX 转义需要 Babel 的依赖,支持装饰器。
yarn add @babel/core babel-loader @babel/preset-env @babel/preset-react @babel/plugin-proposal-decorators @babel/plugin-proposal-object-rest-spread -D
在 webpack.config.js 中增加 loader 的配置(module.rules 数组中)。
module.exports = {//other code
module: {
rules: [
{
test: /\.jsx?$/,
use: [
{
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/react'],
plugins: [
[
"@babel/plugin-proposal-decorators",
{ "legacy": true }
]
]
}
}
],
include: path.resolve(__dirname, 'src'),
exclude: /node_modules/
},
]
}
}
压缩JS文件
安装依赖
yarn add uglifyjs-webpack-plugin -D
在 webpack.config.js 中增加 optimization 的配置
const UglifyWebpackPlugin = require('uglifyjs-webpack-plugin');module.exports = {
//other code
optimization: {
minimizer: [
new UglifyWebpackPlugin({
parallel: 4
})
]
}
}
分离出CSS
因为CSS的下载和JS可以并行,当一个HTML文件很大的时候,可以把CSS单独提取出来加载
安装依赖
yarn add mini-css-extract-plugin -D
在 webpack.config.js 中增加 plugins 的配置,并且将 'style-loader' 修改为 { loader: MiniCssExtractPlugin.loader}。CSS打包在单独目录,那么配置filename。
const MiniCssExtractPlugin = require('mini-css-extract-plugin');module.exports = {
//other code
module: {
rules: [
{
test: /\.css/,
use: [{ loader: MiniCssExtractPlugin.loader}, 'css-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
{
test: /\.less/,
use: [{ loader: MiniCssExtractPlugin.loader }, 'css-loader', 'less-loader'],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
]
},
plugins: [
new MiniCssExtractPlugin({
filename: 'css/[name].css'
})
]
}
压缩CSS文件
安装依赖
yarn add optimize-css-assets-webpack-plugin -D
在 webpack.config.js 中的 optimization 中增加配置
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');module.exports = {
//other code
optimization: {
minimizer: [
new OptimizeCssAssetsWebpackPlugin()
]
}
}
支持react和mobx
安装react依赖
yarn add react react-dom
安装mobx依赖
yarn add mobx mobx-react
支持typescript
安装依赖
yarn add typescript awesome-typescript-loader -D
安装react的类型依赖(否则会有命名空间和.d.ts相关报错)
yarn add @types/react @types/react-dom
在 webpack.config.js 中增加 loader 的配置(module.rules 数组中)。
module.exports = {//other code
module: {
rules: [
{
test: /\.(tsx|ts)?$/,
loader: "awesome-typescript-loader",
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
}
]
}
}
在根目录下添加tsconfig.json
{"compilerOptions": {
"baseUrl": ".",
"outDir": "build/dist",
"module": "esnext",
"target": "es5",
"lib": ["es6", "dom"],
"sourceMap": true,
"allowJs": true,
"jsx": "react",
"moduleResolution": "node",
"experimentalDecorators": true,
"rootDir": "./",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": false,
"importHelpers": true,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": false,
"allowSyntheticDefaultImports": true
},
"exclude": [
"node_modules",
"build",
"scripts",
"acceptance-tests",
"webpack",
"jest",
"src/setupTests.ts"
]
}
在根目录下添加tslint.json
{"extends": ["tslint:recommended", "tslint-react", "tslint-config-prettier"],
"rules": {
"no-empty-interface":false,
"no-empty-block":false,
"no-unused-expression":false,
"object-literal-sort-keys":false,
"no-empty":false,
"semicolon": [false, "always"],
"no-default-export": false,
"member-access": true,
"ordered-imports": false,
"import-sources-order": "any",
"named-imports-order": "any",
"interface-over-type-literal":false,
"jsx-no-lambda":false,
"variable-name": [
true,
"ban-keywords",
"check-format",
"allow-leading-underscore",
"allow-trailing-underscore",
"allow-pascal-case",
"allow-snake-case"
],
"no-console": false,
"no-angle-bracket-type-assertion": false,
"jsx-no-string-ref":false,
"prefer-for-of":false,
"member-ordering":false,
"only-arrow-functions":false,
"object-literal-shorthand":false
},
"linterOptions": {
"exclude": [
"config/**/*.js",
"node_modules/**/*.ts",
"coverage/lcov-report/*.js"
]
},
"strict": false
}
打包前先清空输出目录
安装依赖
yarn add clean-webpack-plugin -D
在 webpack.config.js 中增加 plugins 的配置
const {CleanWebpackPlugin} = require('clean-webpack-plugin');module.exports = {
//other code
plugins: [
new CleanWebpackPlugin()
]
}
( 注意3.0版本的clean-webpack-plugin有大改动,需要通过构造函数取出CleanWebpackPlugin再用 )
至此,webpack配置已经基本能满足react+less+typescript+mobx开发需求。
完整webpack.config.js和package.json文件
webpack.config.js文件
const path = require('path');// 打包html的插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 压缩JS的插件
const UglifyWebpackPlugin = require('uglifyjs-webpack-plugin');
// 分离css文件
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
// 打包前先清空输出目录
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
module.exports = {
mode: 'development',
// 入口 这里应用程序开始执行
entry: path.resolve(__dirname, 'src/index.tsx'),
// 出口
output: {
// 所有输出文件的目标路径
path: path.resolve(__dirname, 'dist'),
// 输出的文件名
filename: 'bundle.js',
// 输出解析文件的目录,url 相对于 HTML 页面, publicPath 上线时配置的是cdn的地址。
// 静态资源最终访问路径 = output.publicPath + 资源loader或插件等配置路径
publicPath: './'
},
devServer: {
hot: true,
port: 3000,
open: true,
contentBase: path.resolve(__dirname, 'dist'),
publicPath: '/',
// stats: 'none'
},
module: {
rules: [
/*
* 支持css
* 通过使用不同的 style-loader 和 css-loader, 可以将 css 文件转换成JS文件类型。
* */
{
test: /\.css/,
// use: ['style-loader', 'css-loader'],
use: [
{
loader: MiniCssExtractPlugin.loader
},
'css-loader'
],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
/*
* 支持编译less和sass
* */
{
test: /.less/,
// use: ['style-loader', 'css-loader', 'less-loader'],
use: [
{
loader: MiniCssExtractPlugin.loader
},
'css-loader',
'less-loader'
],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
/*
* 支持加载图片
* file-loader: 解决CSS等文件中的引入图片路径问题
* url-loader: 当图片小于limit的时候会把图片Base64编码,大于limit参数的时候还是使用file-loader进行拷贝
* */
{
test: /\.(gif|jpg|png|bmp|eot|woff|woff2|ttf|svg)/,
use: [
{
loader: 'url-loader',
options: {
limit: 1,
outputPath: 'images'
}
}
]
},
/*
* 支持转义 ES6/ES7/JSX ,支持react
* ES6/ES7/JSX 转义需要 Babel 的依赖,支持装饰器。
* */
{
test: /\.jsx?$/,
use: [
{
loader: "babel-loader",
options: {
presets: ['@babel/preset-env', '@babel/react'],
plugins: [
[
"@babel/plugin-proposal-decorators",
// "@babel/plugin-proposal-class-properties",
{
"legacy": true
}
]
]
}
}
],
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
},
/*
* 支持转义 支持typescript
* ES6/ES7/JSX 转义需要 Babel 的依赖,支持装饰器。
* */
{
test: /\.(tsx|ts)?$/,
loader: "awesome-typescript-loader",
exclude: /node_modules/,
include: path.resolve(__dirname, 'src')
}
]
},
optimization: {
minimizer: [
new UglifyWebpackPlugin({
parallel: 4
})
]
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, 'public/index.html')
}),
new MiniCssExtractPlugin({
filename:'css/[name].css'
}),
new CleanWebpackPlugin()
]
};
package.json文件
{"name": "webpack_cli",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"start": "webpack-dev-server --mode development",
"build": "webpack --mode production"
},
"devDependencies": {
"@babel/core": "^7.5.5",
"@babel/plugin-proposal-decorators": "^7.4.4",
"@babel/plugin-proposal-object-rest-spread": "^7.5.5",
"@babel/preset-env": "^7.5.5",
"@babel/preset-react": "^7.0.0",
"@types/react": "^16.9.2",
"@types/react-dom": "^16.8.5",
"awesome-typescript-loader": "^5.2.1",
"babel-loader": "^8.0.6",
"clean-webpack-plugin": "^3.0.0",
"css-loader": "^3.2.0",
"file-loader": "^4.2.0",
"html-webpack-plugin": "^3.2.0",
"less": "^3.10.1",
"less-loader": "^5.0.0",
"mini-css-extract-plugin": "^0.8.0",
"optimize-css-assets-webpack-plugin": "^5.0.3",
"style-loader": "^1.0.0",
"typescript": "^3.5.3",
"uglifyjs-webpack-plugin": "^2.2.0",
"url-loader": "^2.1.0",
"webpack": "^4.39.2",
"webpack-cli": "^3.3.7",
"webpack-dev-server": "^3.8.0"
},
"dependencies": {
"mobx": "^5.13.0",
"mobx-react": "^6.1.3",
"react": "^16.9.0",
"react-dom": "^16.9.0"
}
}
学习更多webpack配置请进入webpack官网 webpack官网链接
本文配置将持续升级优化
以上是 从零配置webpack(react+less+typescript+mobx) 的全部内容, 来源链接: utcz.com/z/381947.html