因爲前面客戶端代碼爲html+js+jquery,這種最原始的寫法並不利於後續代碼維護和添加新功能,因此使用react將以前代碼進行重構。其好處一個是使用react可使後面的代碼更利於維護可讀性更好,並且在使用wepack本身搭建react項目中會遇到各類各樣的問題,在解決這些問題也能對webpack和react甚至是其餘相關內容有更深入認識。css
1.打包多頁面優化:
以前webpack在打包多頁面直接在plugins
中配置了多個HtmlWebpackPlugin
,在HtmlWebpackPlugin
的template
中設置一個通用的html模版:html
plugins
中:
const pagesFileName = path.resolve(__dirname, '../client/pages')
const plugins = [
new webpack.NoEmitOnErrorsPlugin(),
new CleanWebpackPlugin(),
new UglifyJsPlugin(),
new OptimizeCSSAssetsPlugin({
assetNameRegExp: /\.css$/g,
cssProcessor: require('cssnano')
}),
new MiniCssExtractPlugin({
filename: 'css/[name].[contenthash:8].css',
chunkFilename: 'css/[name].[contenthash:8].css',
ignoreOrder: false
})
]
// 添加多頁面
fs.readdirSync(pagesFileName).forEach(name => {
plugins.push(
new HtmlWebpackPlugin({
template: './public/index.html',
filename: name + '.html',
chunks: [name, 'manifest', 'vendors', 'common']
})
)
})
複製代碼
2. babel優化
將balel中presets寫到了.babelrc
中,添加了@babel/preset-react
對jsx代碼進行編譯:node
.babelrc:
{
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3
}
],
"@babel/preset-react"
]
}
複製代碼
3. 設置了webpack別名
直接在alias中,設置本身喜歡的名字和對應目錄的路徑便可:react
resolve: {
alias: {
'@common': path.resolve(__dirname, '../client/common')
}
},
複製代碼
我這裏只設置了公共代碼的別名 @common。
4. 添加了css前綴
主要使用到了postcss-loader
和autoprefixer
。只需處理css的loader中加上postcss-loader
;在postcss.config.js
中寫入postcss-loader
的相關配置;在package.json
中添加browserslist
設置須要兼容的瀏覽器便可:jquery
// webpack.common.js
{
test: /\.css$/i,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '/'
}
},
{ loader: 'css-loader', options: { importLoaders: 1 } },
'postcss-loader'
]
}
// postcss.config.js
module.exports = {
plugins: [require('autoprefixer')()]
}
// package.json
"browserslist": [
"defaults",
"not ie < 11",
"last 2 versions",
"> 1%",
"iOS 7",
"last 3 iOS versions"
]
複製代碼
其實前面對webpack進行優化後,重構客戶端代碼就比較容易了,就是代碼轉成了react的寫法,具體的業務相關代碼就很少介紹了,就是按react的語法改了以前的代碼。這裏介紹一下每一個頁面的結構。 因爲webpack在進行編譯時入口都設置爲 index.js
:webpack
// 入口
const entries = fs.readdirSync(pagesFileName).reduce((entries, dir) => {
const fullDir = path.join(pagesFileName, dir)
// 這裏都是拼接了index.js
const entry = path.join(fullDir, 'index.js')
if (fs.statSync(fullDir).isDirectory() && fs.existsSync(entry)) {
entries[dir] = ['webpack-hot-middleware/client', entry]
}
return entries
}, {})
複製代碼
因此當我要建立一個新頁面的時候須要在每一個目錄下新建index.js
用來做爲頁面的入口:git
// index.js
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
ReactDOM.render(<App />, document.getElementById('root'))
複製代碼
App.js
則爲當前頁面的根組件。github
本章介紹了用react重構以前jquery代碼時須要對webpack進行的一些優化即配置,因爲目前項目邏輯比較簡單,在項目中使用react的代碼也都是最基礎的語法,因此主要介紹了一些使用webpack構建react項目的方法。web
GitHub地址:戳這裏json
本項目僅爲學習交流使用,若是有小夥伴有更好的建議歡迎提出來你們一塊兒討論,另外感興趣的小夥伴就點個star吧! ^_^