当下前端最火的两个框架就是了 React 和 Vue 了,Facebook 官方推出的 create-react-app ,Vue 也有本身的 CLI 工具Vue-CLI,两个工具都已经很是好用,但在实际项目中,咱们仍然须要作一些修改才能够知足实际项目上线的需求,同时咱们仍但愿有更多所谓个性化设置来支持项目。因此掌握 Webpack 中 React 和 Vue 的配置仍是颇有必要的事情。javascript
建立项目目录,比较在本地建立一个 myapp
的文件夹,依次执行初始化、安装React、安装Webpack和Babel等操做,具体执行命令以下:html
# 新建目录,而且进入
mkdir react-webpack && cd $_
# 建立 package.json
npm init -y
# 安装 react react-dom依赖
npm i react react-dom
# 安装 webpack 和 webpack-cli 开发依赖
npm i webpack webpack-cli -D
# 安装 babel
npm i babel-loader @babel/core @babel/preset-env -D
# 安装 babel preset-react
npm i @babel/preset-react -D
复制代码
还须要添加支持jsx文件的Babel,新建 webpack.config.js 的配置文件,内容以下:前端
module.exports = {
resolve: {
extensions: ['.wasm', '.mjs', '.js', '.json', '.jsx']
},
module: {
rules: [
{
test: /\.jsx?$/, // jsx/js文件的正则
exclude: /node_modules/, // 排除 node_modules 文件夹
use: {
// loader 是 babel
loader: 'babel-loader',
options: {
// babel 转义的配置选项
babelrc: false,
presets: [
// 添加 preset-react
require.resolve('@babel/preset-react'),
[require.resolve('@babel/preset-env'), {modules: false}]
],
cacheDirectory: true
}
}
}
]
}
};
复制代码
在项目的根目录下建立src目录,在src下分别建立如下文件:vue
App.js文件:java
// App.jsx
import React from 'react';
import ReactDOM from 'react-dom';
const App = () => {
return (
<div> <h1>Hello React and Webpack</h1> </div>
);
};
export default App;
ReactDOM.render(<App />, document.getElementById('app')); 复制代码
index.js文件:node
// index.jsx
import App from './App'; // 这里能够省略.jsx
复制代码
在 webpack.config.js 中添加 entry:react
module.exports = {
entry: './src/index.jsx'
// ...
};
复制代码
接下来在项目根目录下建立 public 目录,用于存放静态资源文件,新建 index.html 文件,做为项目的模板,内容以下:webpack
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>Hello React Webpack</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
复制代码
咱们须要使用 html-webpack-plugin 插件来复制 index.html 到 dist 文件夹下,首先是安装 html-webpack-plugin :web
cnpm i html-webpack-plugin -D
复制代码
修改 webpack.config.js:npm
const HtmlWebPackPlugin = require('html-webpack-plugin');
module.exports = {
// ...
plugins: [
new HtmlWebPackPlugin({
template: 'src/index.html',
filename: 'index.html'
})
]
};
复制代码
在 scripts 中配置打包命令:
{
"scripts": {
"build": "webpack --mode production"
}
}
复制代码
首先使用webpack-dev-server搭建一个本地开发服务,安装webpack-dev-server依赖:
npm i webpack-dev-server -D
复制代码
在package.json增长start的命令:
{
"scripts": {
"build": "webpack --mode production",
"start": "webpack-dev-server --mode development --open"
}
}
复制代码
为了方便开发,咱们将新建了一个webpack.config.dev.js的配置文件:
const path = require('path');
const HtmlWebPackPlugin = require('html-webpack-plugin');
module.exports = {
mode: 'development',
devtool: 'cheap-module-source-map',
devServer: {
contentBase: path.join(__dirname, './src/'),
publicPath: '/',
host: '127.0.0.1',
port: 3000,
stats: {
colors: true
}
},
entry: './src/index.jsx',
// 将 jsx 添加到默认扩展名中,省略 jsx
resolve: {
extensions: ['.wasm', '.mjs', '.js', '.json', '.jsx']
},
module: {
rules: [
{
test: /\.jsx?$/, // jsx文件的正则
exclude: /node_modules/, // 排除 node_modules 文件夹
use: {
// loader 是 babel
loader: 'babel-loader',
options: {
// babel 转义的配置选项
babelrc: false,
presets: [
// 添加 preset-react
require.resolve('@babel/preset-react'),
[require.resolve('@babel/preset-env'), {modules: false}]
],
cacheDirectory: true
}
}
}
]
},
plugins: [
new HtmlWebPackPlugin({
template: 'src/index.html',
filename: 'index.html',
inject: true
})
]
};
复制代码
对应的package.json的scripts也修改下,start 添加 config 文件路径:
{
"scripts": {
"build": "webpack --mode production",
"start": "webpack-dev-server --config './webpack.config.dev.js' --open "
}
}
复制代码
到这里,能够执行下npm start看下效果了!
上面 React 部分已经详细讲解了一些重复的步骤,这里就简单说下操做步骤和代码。
首先也是建立目录、初始化 package.json、安装 Vue、安装 Webpack 和安装 Babel。
# 新建目录,而且进入
mkdir vue-webpack && cd $_
# 建立 package.json
npm init -y
# 安装 vue 依赖
npm i vue
# 安装 webpack 和 webpack-cli 开发依赖
npm i webpack webpack-cli -D
# 安装 babel
npm i babel-loader @babel/core @babel/preset-env -D
# 安装 loader
npm i vue-loader vue-template-compiler -D
# 安装 html-webpack-plugin
npm i html-webpack-plugin -D
复制代码
而后在 src 文件夹下新建App.vue和index.js两个文件,内容以下:
// app.js
import Vue from 'vue';
import App from './app.vue';
Vue.config.productionTip = false;
new Vue({
render: h => h(App)
}).$mount('#app');
复制代码
<template>
<div id="app">
Hello Vue & Webpack
</div>
</template>
<script> export default {}; </script>
复制代码
而后建立一个 HTML 文件index.html:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>Webpack Vue Demo</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
复制代码
最后配置webpack.config.js,内容以下:
const HtmlWebpackPlugin = require('html-webpack-plugin');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
resolve: {
alias: {
vue$: 'vue/dist/vue.esm.js'
},
extensions: ['*', '.js', '.vue', '.json']
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader'
}
},
{
test: /\.vue$/,
loader: 'vue-loader'
}
]
},
plugins: [
new VueLoaderPlugin(),
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html'
})
]
};
复制代码
Vue 的配置文件跟 React 最大区别是,React 是直接扩展了 Babel 的语法,而 Vue 语法的模板还须要使用vue-loader来处理。
完成上面配置后,执行下npx webpack看下 dist 产出吧。开发相关的配置跟 React 部分基本一致,这里再也不重复介绍了。