項目連接:github.com/MrZhang123/…css
├── README.md
├── build
│ ├── webpack.base.config.js
│ ├── webpack.dev.config.js
│ └── webpack.production.config.js
├── package.json
├── postcss.config.js
├── src
│ ├── App.js
│ ├── components
│ │ └── Loading
│ │ └── index.js
│ ├── index.html
│ ├── main.js
│ ├── redux
│ │ ├── actions
│ │ │ └── demo.js
│ │ ├── middleware
│ │ │ └── index.js
│ │ ├── reducers
│ │ │ ├── demo.js
│ │ │ └── index.js
│ │ └── store
│ │ └── index.js
│ ├── static
│ │ └── css
│ │ └── normalize.css
│ ├── styles.scss
│ └── views
│ ├── Content
│ │ ├── About
│ │ │ └── index.js
│ │ ├── Home
│ │ │ └── index.js
│ │ ├── Topics
│ │ │ └── index.js
│ │ └── router.js
│ └── RouterLink
│ └── index.js
└── yarn.lock
複製代碼
首先搭建一個基礎的React開發環境,沒有redux和react-routerhtml
# dependencies
yarn add react react-dom
# devDependencies
yarn add --dev webpack webpack-cli webpack-dev-server babel-core babel-loader babel-polyfill babel-preset-env babel-preset-react babel-preset-stage-0 cross-env css-loader file-loader jsx-loader style-loader url-loader
複製代碼
說明node
在build文件夾下新建三個文件——webpack.base.config.js, webpack.dev.config.js, webpack.production.config.js,將dev和produciton裏公共的部分放在base文件中。react
// webpack.base.config.js
const path = require('path')
module.exports = {
entry: {
main: [
'babel-polyfill',
path.resolve(__dirname, '../src/main.js')
]
},
output: {
path: path.resolve(__dirname, '../dist'),
publicPath: '/',
filename: '[name].js',
chunkFilename: 'chunk/[name].[chunkhash].js'
},
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.(js|jsx)$/,
exclude: /(node_modules|bower_components)/,
loader: 'babel-loader'
},
{
test: /\.(png|jpg|gif|svg)$/,
loader: 'url-loader',
options: {
limit: 10000,
name: '[name].[ext]?[hash]'
}
}
]
},
resolve: {
modules: ['node_modules'],
extensions: ['.web.js', '.js', '.jsx', '.json']
},
mode: '' // webpack v4 add
}
複製代碼
因爲是webpack的公共配置文件,因此這裏mode設置空,以後在dev和prodctuon中再分別設置。webpack
在webpack v4中新增一些默認配置,經過設置mode
是development
和production
(默認)來啓用在開發環境和生產環境的默認配置。git
1.兩者都有的配置github
//parent chunk中解決了的chunk會被刪除
optimization.removeAvailableModules:true
//刪除空的chunks
optimization.removeEmptyChunks:true
//合併重複的chunk
optimization.mergeDuplicateChunks:true
複製代碼
2.development的默認配置web
//調試
devtool:eval
//緩存模塊, 避免在未更改時重建它們。
cache:true
//緩存已解決的依賴項, 避免從新解析它們。
module.unsafeCache:true
//在 bundle 中引入「所包含模塊信息」的相關注釋
output.pathinfo:true
//在可能的狀況下肯定每一個模塊的導出,被用於其餘優化或代碼生成。
optimization.providedExports:true
//找到chunk中共享的模塊,取出來生成單獨的chunk
optimization.splitChunks:true
//爲 webpack 運行時代碼建立單獨的chunk
optimization.runtimeChunk:true
//編譯錯誤時不寫入到輸出
optimization.noEmitOnErrors:true
//給模塊有意義的名稱代替ids
optimization.namedModules:true
//給模chunk有意義的名稱代替ids
optimization.namedChunks:true
複製代碼
3.production的默認設置json
//性能相關配置
performance:{hints:"error"....}
//某些chunk的子chunk以一種方式被肯定和標記,這些子chunks在加載更大的塊時沒必要加載
optimization.flagIncludedChunks:true
//給常常使用的ids更短的值
optimization.occurrenceOrder:true
//肯定每一個模塊下被使用的導出
optimization.usedExports:true
//識別package.json or rules sideEffects 標誌
optimization.sideEffects:true
//嘗試查找模塊圖中能夠安全鏈接到單個模塊中的段。- -
optimization.concatenateModules:true
//使用uglify-js壓縮代碼
optimization.minimize:true
複製代碼
const webpack = require('webpack')
const config = require('./webpack.base.config.js')
const WebpackDevServer = require('webpack-dev-server')
const PORT = process.env.PORT || 8000 // 默認8000端口,能夠經過package.json配置
config.entry.main = (config.entry.main || []).concat([
`webpack-dev-server/client?http://localhost:${PORT}/`,
'webpack/hot/dev-server'
])
config.plugins = (config.plugins || []).concat([
new webpack.HotModuleReplacementPlugin()
])
config.mode = 'development'
const compiler = webpack(config)
const server = new WebpackDevServer(compiler, {
hot: true, // 開啓wbepack HMR
quiet: true,
historyApiFallback: true,
filename: config.output.filename,
publicPath: config.output.publicPath,
stats: {
colors: true
}
})
server.listen(PORT, 'localhost', () => {
console.log(`server started at localhost:${PORT}`)
})
複製代碼
關於output.publicPath
和devServer.publicPath
的區別能夠參考個人文章:Webpack中publicPath詳解redux
const path = require('path')
const webpack = require('webpack')
const config = require('./webpack.base.config')
const CleanWebpackPlugin = require('clean-webpack-plugin')
config.mode = 'production'
config.plugins = (config.plugins || []).concat([
new CleanWebpackPlugin(['dist'], {
root: path.resolve(__dirname, '../')
}),
new webpack.HashedModuleIdsPlugin()
])
module.exports = config
複製代碼
至此,一個簡單的React開發環境就搭建完成,可是在使用後會發現一些問題,好比webpack將js和css打包在一塊兒,咱們在使用webpack的HMR時候,只要保存,頁面就會刷新,頁面的狀態會重置等問題以及加入經常使用的redux和react-router,下一篇——從零開始搭建React應用(二)——React應用架構將就這些問題做出解決。