国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

基于webpack4.X從零搭建React腳手架的方法步驟

2024-05-06 16:47:11
字體:
供稿:網(wǎng)友

項目初始化

$ npm init

安裝webpack

本次創(chuàng)建是基于webpack4

$ npm install --save-dev

新建webpack配置文件

在根目錄創(chuàng)建build文件夾,添加一個js文件,命名為webpack.base.conf.js

// webpack.base.conf.js 文件const path = require('path');const DIST_PATH = path.resolve(__dirname, '../dist');module.exports = {    entry: {      app: './app/index.js'    },    output: {      filename: "js/bundle.js",      path: DIST_PATH    }};

使用merge的方式來組織webpack基礎配置和不同環(huán)境的配置

先安裝webpack-merge:

$ npm install --save-dev webpack-merge

在build文件夾中再添加一個js文件,命名為 webpack.prod.conf.js

// webpack.prod.conf.js 文件const merge = require('webpack-merge');const baseWebpackConfig = require('./webpack.base.conf');module.exports = merge(baseWebpackConfig, {  mode: 'production'});

在根目錄下創(chuàng)建app目錄,然后創(chuàng)建index.js文件

var element =document.getElementById('root');element.innerHTML = 'hello, world!';

在根目錄創(chuàng)建一個public文件夾,然后新建一個index.html文件

// index.html<!DOCTYPE html><html lang="en"> <head>   <meta charset="UTF-8">   <title>從零開始搭建react工程</title> </head> <body>    <div id="root"></div>    <script src="../dist/js/bundle.js"></script> </body></html>

當前項目目錄樹

|- /app  |- index.js |- /node_modules |- /public  |- index.html |- /build  |- webpack.base.conf.js  |- webpack.prod.conf.js |- package.json |- package-lock.json

安裝webpack-cli

webpack 4.0 版本之后的webpack,已經(jīng)將webpack命令工具遷移到webpack-cli模塊了,需要安裝 webpack-cli

$ npm install --save-dev webpack-cli

package.json文件 scripts屬性配置一個build命令

其值為:webpack --config build/webpack.prod.conf.js,以下是scripts的相關代碼

// package.json"scripts": {  "build": "webpack --config build/webpack.prod.conf.js",  "test": "echo /"Error: no test specified/" && exit 1"},

安裝React

$ npm install --save react react-dom

修改app目錄下的index.js的代碼

import React from "react";import ReactDom from "react-dom";ReactDom.render(  <h1>hello, world!</h1>,  document.getElementById("root"));

注意 import 屬于ES6規(guī)范,因此需要轉(zhuǎn)譯ES2015+的語法,安裝并配置 babel 以及相關依賴

$ npm install --save-dev babel-loader babel-core babel-preset-env babel-preset-react

根目錄創(chuàng)建.babelrc文件,配置presets.

{ "presets": [  [   "env",   {    "targets": {     "browsers": [      "> 1%",      "last 5 versions",      "ie >= 8"     ]    }   }  ],  "react" ]}

修改webpack.base.conf.js文件

// webpack.base.conf.jsconst path = require('path');const APP_PATH = path.resolve(__dirname, '../app');const DIST_PATH = path.resolve(__dirname, '../dist');module.exports = {  entry: {    app: './app/index.js'  },    output: {    filename: 'js/bundle.js',    path: DIST_PATH  },  module: {    rules: [      {        test: //.js?$/,        use: "babel-loader",        include: APP_PATH      }    ]  }};

運行 npm run build

添加插件

public下的index.html本該自動添加到dist目錄,并且引用資源自動加載到該文件,通過html-webpack-plugin實現(xiàn)這一步

$ npm install html-webpack-plugin --save-dev

webpack.prod.conf.js中配置plugins屬性

const merge = require('webpack-merge');const baseWebpackConfig = require('./webpack.base.conf.js');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = merge(baseWebpackConfig, {  mode: 'production',  plugins: [    new HtmlWebpackPlugin({      template: 'public/index.html',      inject: 'body',      minify: {        removeComments: true,        collapseWhitespace: true,        removeAttributeQuotes: true      },    })  ]});

刪除 index.html 中手動引入的 script 標簽

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>從零開始搭建react工程</title></head><body>  <div id="root"></div></body></html>

重新編譯查看 npm run build 瀏覽器打開查看目錄 dist 下的 index.html

以上步驟都成功的前提下繼續(xù)走下一步

生成的文件名添加Hash值,目的是解決緩存問題

修改webpack.prod.conf.js,mode: 'production', 增加以下代碼

// webpack.prod.conf.jsoutput: {  filename: "js/[name].[chunkhash:16].js",},

生成前需要清理之前項目生成的文件,因為由于文件名的改變?nèi)绻粍h除會一直增加

安裝插件 clean-webpack-plugin

$ npm install --save-dev clean-webpack-plugin

修改 webpack.prod.conf.js

// webpack.prod.conf.jsconst merge = require('webpack-merge');const baseWebpackConfig = require('./webpack.base.conf.js');const HtmlWebpackPlugin = require('html-webpack-plugin');const CleanWebpackPlugin = require('clean-webpack-plugin');module.exports = merge(baseWebpackConfig, {  mode: 'production',  output: {    filename: "js/[name].[chunkhash:16].js",  },  plugins: [    new HtmlWebpackPlugin({      template: 'public/index.html',      inject: 'body',      minify: {        removeComments: true,        collapseWhitespace: true,        removeAttributeQuotes: true      },    }),    new CleanWebpackPlugin(['../dist'], { allowExternal: true })  ]});

公共代碼與業(yè)務代碼分離

修改 webpack.base.conf.js 的 entry 入口屬性,抽出框架代碼

entry: {   app: './app/index.js',   framework: ['react','react-dom'],},

修改webpack.prod.conf.js,增加以下代碼,目的是分離框架代碼和業(yè)務代碼

雖然上面步驟抽出框架代碼生成兩個文件,但是app.js還是包含框架代碼

optimization: {    splitChunks: {      chunks: "all",      minChunks: 1,      minSize: 0,      cacheGroups: {        framework: {          test: "framework",          name: "framework",          enforce: true        }      }    }  }

cacheGroups對象,定義了需要被抽離的模塊

其中test屬性是比較關鍵的一個值,他可以是一個字符串,也可以是正則表達式,還可以是函數(shù)。如果定義的是字符串,會匹配入口模塊名稱,會從其他模塊中把包含這個模塊的抽離出來

name是抽離后生成的名字,和入口文件模塊名稱相同,這樣抽離出來的新生成的framework模塊會覆蓋被抽離的framework模塊

整合 webpack-dev-server

開發(fā)環(huán)境開啟服務監(jiān)聽文件改動實時更新最新內(nèi)容

$ npm install --save-dev webpack-dev-server

在build中添加webpack.dev.conf.js文件

const path = require('path');const merge = require('webpack-merge');const baseWebpackConfig = require('./webpack.base.conf.js');const HtmlWebpackPlugin = require('html-webpack-plugin');const webpack = require('webpack');module.exports = merge(baseWebpackConfig, {  mode: 'development',  output: {    filename: "js/[name].[hash:16].js",  },  plugins: [    new HtmlWebpackPlugin({      template: 'public/index.html',      inject: 'body',      minify: {        html5: true      },      hash: false    }),    new webpack.HotModuleReplacementPlugin()  ],  devServer: {    port: '8080',    contentBase: path.join(__dirname, '../public'),    compress: true,    historyApiFallback: true,    hot: true,    https: false,    noInfo: true,    open: true,    proxy: {}  }});

在package.json scripts屬性添加內(nèi)容

"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",

npm run dev

自動打開瀏覽器打開入口頁面實時更新

獨立導出 css 文件

安裝css相關依賴

sass less 預處理

$ npm install extract-text-webpack-plugin$ npm install style-loader css-loader postcss-loader autoprefixer --save-dev$ npm install less sass less-loader sass-loader stylus-loader node-sass --save-dev

webpack.base.conf.js 文件修改

// webpack.base.conf.js{  test: //.css$/,  use: [    {     loader: "style-loader" //在html中插入<style>標簽     },     {       loader: "css-loader",//獲取引用資源,如@import,url()     },     {       loader: "postcss-loader",       options: {          plugins:[            require('autoprefixer')({              browsers:['last 5 version']            })         ]       }    }   ]},{  test://.less$/,  use: [     { loader: "style-loader" },     { loader: "css-loader" },     {      loader: "postcss-loader",//自動加前綴      options: {          plugins:[             require('autoprefixer')({               browsers:['last 5 version']             })         ]      }     },     { loader: "less-loader" }   ]},{   test://.scss$/,   use:[       { loader: "style-loader" },       {           loader: "css-loader",       },       { loader: "sass-loader" },       {        loader: "postcss-loader",       options: {          plugins:[             require('autoprefixer')({              browsers:['last 5 version']             })          ]       }     }   ]},

圖片和路徑處理

$ npm i file-loader url-loader --save-dev

webpack.base.conf.js 文件修改

// webpack.base.conf.js{  test: //.(png|jpg|gif|woff|svg|eot|woff2|tff)$/,  use: 'url-loader?limit=8129',   //注意后面那個limit的參數(shù),當你圖片大小小于這個限制的時候,會自動啟用base64編碼圖片  exclude: /node_modules/}

build 時報錯

Error: Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead
    at Chunk.get (F:/react/createApp/node_modules/webpack/lib/Chunk.js:824:9)

webpack4.0中使用“extract-text-webpack-plugin”報錯

解決辦法

$ npm install extract-text-webpack-plugin@next

背景圖片路徑問題

由于css文件分離出來的原因,會導致在css文件夾下找images文件夾下的圖片

解決辦法 publicPath屬性改為 '/',以絕對路徑的方式尋找資源

{  test://.(png|jpg|gif)$/,  use:[{    loader:'url-loader',    options: {       // outputPath:'../',//輸出**文件夾       publicPath: '/',       name: "images/[name].[ext]",       limit:500 //是把小于500B的文件打成Base64的格式,寫入JS     }   }]},

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 安吉县| 陆丰市| 垫江县| 射洪县| 壤塘县| 义乌市| 乐陵市| 油尖旺区| 迁安市| 平远县| 宁乡县| 鸡东县| 登封市| 英山县| 合山市| 老河口市| 肥城市| 江口县| 宝清县| 苏州市| 左贡县| 甘洛县| 偃师市| 青州市| 高雄县| 紫金县| 买车| 东平县| 册亨县| 视频| 健康| 轮台县| 鹿泉市| 郎溪县| 红安县| 额尔古纳市| 黑山县| 简阳市| 海城市| 贡嘎县| 彰化县|