Reactå¤é¡µé¢åºç¨4(webpack4 æåç¬¬ä¸æ¹å åå ¬å ±ç»ä»¶)
æ¬æç¨æ»å ±9ç¯,æ¯æ¥æ´æ°ä¸ç¯,è¯·å ³æ³¨æä»¬!ä½ å¯ä»¥è¿å ¥å岿¶æ¯æ¥çä»¥å¾æç« ,乿¬è¯·æå¾ æä»¬çæ°æç« !
1ãReactå¤é¡µé¢åºç¨1(webpack4 å¼åç¯å¢æå»º,å æ¬çæ´æ°,api转åç)---2018.04.04
2ãReactå¤é¡µé¢åºç¨2(webpack4 å¤çCSSåå¾ç,å¼å ¥postCSS,åå¾çå¤çç)---2018.04.08
3ãReactå¤é¡µé¢åºç¨3(webpack4 å¤é¡µé¢å®ç°)---2018.04.09
4ãReactå¤é¡µé¢åºç¨4(webpack4 æåç¬¬ä¸æ¹å åå ¬å ±ç»ä»¶)---2018.04.10
5ãReactå¤é¡µé¢åºç¨5(webpack4 å¤é¡µé¢èªå¨åçæå¤å ¥å£æä»¶)---2018.04.11
6ãReactå¤é¡µé¢åºç¨6(webpack4 å¼åç¯å¢æå æ§è½å°æå)---2018.04.12
7ãReactå¤é¡µé¢åºç¨7(webpack4 ç产ç¯å¢é ç½®)---2018.04.13
8ãReactå¤é¡µé¢åºç¨8(webpack4 gulpèªå¨ååå¸å°å¤ä¸ªç¯å¢,çæçæ¬å·,æå æzipç)---2018.04.16
9ãReactå¤é¡µé¢åºç¨9(webpack4 å¼å ¥eslintä»£ç æ£æ¥)---2018.04.17
å¼åç¯å¢:Windows 8,node v8.9.1,npm 5.5.1,WebStorm 2017.2.2
ä»å¤©æä»¬æ¥æ reactï¼react-dom æ¾å° vendor.jsï¼å ¬å ±ç»ä»¶é¨åæ¾å°common.js,
å 为 webpack3 ç CommonsChunkPlugin 被移é¤ï¼ææä»å¤©æä»¬è¦ç¨å°webpack4 ç splitChunksï¼
åºè¯ä¸å¤è¯´ï¼æ¸ç å¼å§ï¼
1ãå ¬ç¨ä»£ç åæå ¬å ±ç»ä»¶
æä»¬å æ¥åæä¸ä»ä¹ç®æ¯å ¬ç¨ä»£ç ï¼
红è²é¨åæ¯ä¸ä¸æ ·çï¼å ¶ä½é¨åéå¤äºï¼æä»¬å¯ä»¥åæå ¬ç¨ç»ä»¶ï¼
2ãæ°å»ºcommonç®å½ï¼å¹¶æ°å»ºHeader.jsx å Footer.jsx
Header.jsx
import React from 'react';
import '../../public/css/common.pcss';
const Header = () =>
<div className="top">
<div>è¿æ¯å¤´é¨</div>
<div>
<i className="logo"/>
</div>
<div className="nav">
<a href="/index.html">é¦é¡µ</a> <a href="/shop.html">åå</a>
</div>
</div>
;
export default Header;
Footer.jsx
import React from 'react';
const Footer = () =>
<div className="bottom">
è¿æ¯åºé¨
</div>
;
export default Footer;
3ãä¿®æ¹é¦é¡µIndex.jsx
import React from 'react';
import Header from '../common/Header';
import Footer from '../common/Footer';
import '../../public/css/index.pcss';
class Index extends React.Component {
render() {
return (
<div className="cont">
<Header/>
<div className="index">
è¿æ¯é¦é¡µ
</div>
<Footer/>
</div>
);
}
}
export default Index;
4ãä¿®æ¹ååIndex.jsx
import React from 'react';
import Header from '../common/Header';
import Footer from '../common/Footer';
import '../../public/css/shop.pcss';
class Index extends React.Component {
render() {
return (
<div className="cont">
<Header/>
<div className="shop">
è¿æ¯åå
</div>
<Footer/>
</div>
);
}
}
export default Index;
5ãæ¥çæµè§å¨ æ¯å¦æ£å¸¸
6ãéç¹é¨åï¼æåç¬¬ä¸æ¹å åå ¬å ±ç»ä»¶
config-> webpack -> webpack.dev.conf.js
æ°å¢å¦ä¸ä»£ç
optimization: {
//å æ¸ å
runtimeChunk: {
name: "manifest"
},
//æåå ¬å ±å
splitChunks: {
cacheGroups: {
//项ç®å ¬å ±ç»ä»¶
common: {
chunks: "initial",
name: "common",
minChunks: 2,
maxInitialRequests: 5,
minSize: 0
},
//ç¬¬ä¸æ¹ç»ä»¶
vendor: {
test: /node_modules/,
chunks: "initial",
name: "vendor",
priority: 10,
enforce: true
}
}
}
},
宿´ä»£ç
const webpack = require('webpack');//å¼å ¥webpack
const opn = require('opn');//æå¼æµè§å¨
const merge = require('webpack-merge');//webpacké ç½®æä»¶åå¹¶
const path = require("path");
const baseWebpackConfig = require("./webpack.base.conf");//åºç¡é ç½®
const webpackFile = require("./webpack.file.conf");//ä¸äºè·¯å¾é ç½®
let config = merge(baseWebpackConfig, {
/*设置å¼åç¯å¢*/
mode: 'development',
output: {
path: path.resolve(webpackFile.devDirectory),
filename: 'js/[name].js',
chunkFilename: "js/[name].js",
publicPath: ''
},
optimization: {
//å æ¸ å
runtimeChunk: {
name: "manifest"
},
//æåå ¬å ±å
splitChunks: {
cacheGroups: {
//项ç®å ¬å ±ç»ä»¶
common: {
chunks: "initial",
name: "common",
minChunks: 2,
maxInitialRequests: 5,
minSize: 0
},
//ç¬¬ä¸æ¹ç»ä»¶
vendor: {
test: /node_modules/,
chunks: "initial",
name: "vendor",
priority: 10,
enforce: true
}
}
}
},
plugins: [
/*è®¾ç½®çæ´æ°*/
new webpack.HotModuleReplacementPlugin(),
],
module: {
rules: [
{
test: /\.(js|jsx)$/,
use: [
'babel-loader',
],
include: [
path.resolve(__dirname, "../../app"),
path.resolve(__dirname, "../../entryBuild")
],
exclude: [
path.resolve(__dirname, "../../node_modules")
],
},
{
test: /\.(css|pcss)$/,
loader: 'style-loader?sourceMap!css-loader?sourceMap!postcss-loader?sourceMap',
exclude: /node_modules/
},
{
test: /\.(png|jpg|gif|ttf|eot|woff|woff2|svg|swf)$/,
loader: 'file-loader?name=[name].[ext]&outputPath=' + webpackFile.resource + '/'
}
]
},
/*设置api转å*/
devServer: {
host: '0.0.0.0',
port: 8080,
hot: true,
inline: true,
contentBase: path.resolve(webpackFile.devDirectory),
historyApiFallback: true,
disableHostCheck: true,
proxy: [
{
context: ['/api/**', '/u/**'],
target: 'http://192.168.12.100:8080/',
secure: false
}
],
/*æå¼æµè§å¨ å¹¶æå¼æ¬é¡¹ç®ç½å*/
after() {
opn('http://localhost:' + this.port);
}
}
});
module.exports = config;
éæ°æ§è¡ npm run dev
å¤åºæ¥ ä¸ä¸ªæä»¶å嫿¯ï¼
manifest.jsï¼å æ¸ åï¼
vendor.js(ç¬¬ä¸æ¹å ï¼ææ¾ä½ç§¯å¾å¤§ï¼è¿æ¯å¼åç¯å¢ï¼ç产ç¯å¢ä¼åå缩)
common.jsï¼å ¬å ±ç»ä»¶ï¼
æ¤æ¶æµè§å¨åºè¯¥æ¯ç©ºç½ï¼å 为缺å°è¿ä¸ä¸ªæä»¶ï¼
7ãä¿®æ¹htmlæä»¶
devBulid ä¸ index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="telephone=no" name="format-detection">
<title>react1</title>
</head>
<body>
<div id="app"></div>
<script type=text/javascript src=js/manifest.js></script>
<script type=text/javascript src=js/vendor.js></script>
<script type=text/javascript src=js/common.js></script>
<script type=text/javascript src=js/index.js></script>
</body>
</html>
devBulid ä¸ shop.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="telephone=no" name="format-detection">
<title>react1</title>
</head>
<body>
<div id="app"></div>
<script type=text/javascript src=js/manifest.js></script>
<script type=text/javascript src=js/vendor.js></script>
<script type=text/javascript src=js/common.js></script>
<script type=text/javascript src=js/shop.js></script>
</body>
</html>
8ãåå·æ°æµè§å¨ï¼å°±æ£å¸¸äº
æ¬æå®
ç¦æ¢æ èªè½¬è½½,å¦é转载请å¨å ¬ä¼å·ä¸çè¨èç³»æä»¬!
æè°¢ç«¥éä»¬æ¯æ!
å¦æä½ æä»ä¹é®é¢,å¯ä»¥å¨ä¸æ¹çè¨ç»æä»¬!