1. 程式人生 > >手動搭建 webpack + react 框架

手動搭建 webpack + react 框架

手動搭建 webpack + react 框架

準備

建立空專案資料夾。
在這裡插入圖片描述

建議安裝cnpm,下文所有npm可以用cnpm代替
npm install -g cnpm --registry=https://registry.npm.taobao.org

初始化 npm 環境

npm init 一路回車即可
在這裡插入圖片描述

依賴安裝

  npm i webpack  -D
  npm i webpack-cli -D  (因為webpak 到 4版本以上 就需要這個 ,不然會報錯)

建立目錄及配置檔案

建立 src資料夾,src下建立webpack打包入口檔案 index.js
建立webpack.config.js 並編寫配置檔案。

	const path = require('path') // 引入‘path’,為了在這裡使用絕對路徑,避免相對路徑在不同系統時出現不必要的問題
	var webpack = require('webpack')
	module.exports = {
	  // 應用入口
	  entry: {
	    app: path.join(__dirname, './src/index.js') // index.js作為打包的入口
	  },
	  // 輸出目錄
	  output: {
	    filename: 'build.js',
	    // filename: '[name].[hash:8].js', //name代表entry對應的名字; hash代表 整個app打包完成後根據內容加上hash。一旦整個檔案內容變更,hash就會變化
path: path.join(__dirname, 'dist'), // 打包好之後的輸出路徑 }, }

修改package.json 下

在script中新增如下程式碼:

"build": "webpack --mode production"

執行 npm run build
就可以把src下面的index.js檔案打包出來了,在dist資料夾可以看到打包檔案
build.js最後可以看到寫的內容
在這裡插入圖片描述

需要引入 babel-loader 來編譯 es6

npm i babel-core babel-loader babel-preset-env -D   
npm install babel babel-cli  -D      
npm install babel-preset-react  babel-preset-es2015 -D

然後配置loader

const path = require('path') // 引入‘path’,為了在這裡使用絕對路徑,避免相對路徑在不同系統時出現不必要的問題
var webpack = require('webpack')
module.exports = {
  // 應用入口
  entry: {
    app: path.join(__dirname, './src/index.js') // index.js作為打包的入口
  },
  // 輸出目錄
  output: {
    filename: 'build.js',
    // filename: '[name].[hash:8].js', //name代表entry對應的名字; hash代表 整個app打包完成後根據內容加上hash。一旦整個檔案內容變更,hash就會變化
    path: path.join(__dirname, 'dist'), // 打包好之後的輸出路徑
  },
  module: {
    rules: [{
      test: /\.(js|jsx)$/, //使用loader的目標檔案。這裡是.js
      use: {
        loader: 'babel-loader',
        options: {
          presets: ["env", "react"] //['@babel/preset-react']
        },
      },
      exclude: [
        path.join(__dirname, '../node_modules') // 由於node_modules都是編譯過的檔案,這裡我們不讓babel去處理其下面的js檔案
      ]
    }]
  }
}

在專案根目錄下建立 babel 的配置檔案: .babelrc (前面有個點)

{
  "presets": [
    ["es2015", {"loose": true}],
    "react"
  ]
}

此時再執行 npm run build可能報錯,
在這裡插入圖片描述
原因是"babel-loader": "^8.x.x"版本的問題,與babel-core 6.x.x不相容,把loader降到7.1.5版本即可解決: npm i -D [email protected]

使用html模板

使用 html-webpack-plugin 外掛,webpack 可以根據你的配置生成你想要的檔案 html
npm i html-webpack-plugin -D
修改配置檔案,新增plugins:

const HTMLPlugin = require('html-webpack-plugin')
······
······
plugins: [
    new HTMLPlugin({
      filename: 'distTemp.html', //制定的檔案,預設
      template: 'template.html' //制定html生成使用的模板檔案 
    }) // 生成一個html頁面,同時在webpack編譯的時候。把我們所生成的entry都注入到這個html頁面中,路徑都是根據我們output配置的來走的。
  ]

建立html模板
在這裡插入圖片描述

再執行 npm run build
dist資料夾下就會多一個html檔案
在這裡插入圖片描述

開發模式下啟動伺服器並實時重新整理

npm i webpack-dev-server -D
在package.json中script中新增
"dev": "webpack-dev-server --mode development --open",
修改配置檔案:
devServer.index一定要和HTMLPlugin.filename一致,否則報錯
在這裡插入圖片描述
執行 npm run dev 就會自動開啟瀏覽器了,頁面就是模板頁面
安裝 react 模組
npm i react -D
npm i react-dom -D
修改入口檔案,編寫react程式碼,

import React from 'react'
import ReactDom from 'react-dom'
// var React = require('react')
// var ReactDom = require('react-dom')
// 推薦使用import方式(es6標準),不推薦使用require方式(CommonJS/AMD規範)

let names = ['aa', 'bb']

class Dome extends  React.Component{
  render() {
    return (
      <div>
        {
          names.map(function(name) {
            return <div key={name}> Hello { name } </div>
          })
        }
      </div>
    )
  }
}
export default Dome
ReactDom.render(<Dome />, document.getElementById('root'))

儲存,執行npm run dev

最後推薦並致謝以下內容

webpack中文文件: https://www.webpackjs.com/concepts/
英文文件(推薦): https://webpack.js.org/concepts/
幾本關於webpack的書:
1、 https://zhaoda.net/webpack-handbook/index.html
2、 http://webpack.wuhaolin.cn/
3、 https://fakefish.github.io/react-webpack-cookbook/Getting-started.html
第二本有彈出購買的遮罩層時,F12,幹掉就行了
在這裡插入圖片描述