搭建react的架手架

一、回顧

cnpm i @vue/cli -g ----- 4的腳手架 ------ webpack 4css

cnpm i @vue/cli@3 -g ----- 3的腳手架 ------ webpack 4html

vue create myappvue

cnpm i vue-cli -g ----- 2的腳手架 ------ webapck 3node

vue init webpack myappreact

  • cnpm i @vue/cli-init -g ------ 三、4 兼容 2的寫法

vue init webpack myappwebpack

17年使用vue-cli 2的腳手架,用的是webpack3,命令爲vue init webpack myappios

18年使用@vue/cli 3的腳手架,用的是webpack4,命令爲vue create myappes6

新的腳手架兼容舊的版本建立項目,使用模塊 @vue/cli-initweb

2 和 3 的區別能夠說是 webpack 3和 webpack4的區別vue-cli

webpack4 免配但可配,webpack3 必配

vue的腳手架 基於 webpack4 免配的

react的腳手架 基於 webpack4 配置的

二、webpack的配置 --- webpack 3

基於node,模塊化、組件化開發的利器,配置名稱爲 webpack.config.js

webpack起初是facebook專門爲react而量身打造的,後開源,其餘語言也在用

2.1 建立文件 webpack.config.js

module.exports = {
}

2.2 建立入口文件 src/main.js

console.log('hello webpack')

2.3 配置文件配置入口

module.exports = {
  // entry: './src/main.js' // string類型寫法
  entry: { // object 類型寫法 ---- 推薦寫法
    app: './src/main.js' // 會將本項目打包成爲一個js文件  app.js
  }
}

2.4 配置文件配置輸出

module.exports = {
  // entry: './src/main.js' // string類型寫法
  entry: { // object 類型寫法 ---- 推薦寫法
    app: './src/main.js' // 會將本項目打包成爲一個js文件  app.js
  },
  // +++++++++++++++++++++++++++++++++++++++++++
  output: { // 輸出配置 ----- dist/app.js
    path: __dirname + '/dist', // 項目打包在dist目錄下
    filename: '[name].js' // [name] 表示變量,若是入口肯定名字app,輸出就是app.js
  }
}

2.5 安裝依賴,測試此項配置

cnpm i webpack@3 -g

命令行輸入 webpack 指令 便可打包, dist/app.js出現

2.6 建立頁面index.html,引入導出的js文件,查看效果

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  
</body>
<!-- ++++++++++++++++++++++++++ -->
<script src="dist/app.js"></script>
</html>

2.7 配置自動導入js文件,相似vue

  • 刪除 index.html 中導入js文件

  • 給webpack的配置添加 插件,使用插件導入js
module.exports = {
  // entry: './src/main.js' // string類型寫法
  entry: { // object 類型寫法 ---- 推薦寫法
    app: './src/main.js' // 會將本項目打包成爲一個js文件  app.js
  },
  output: { // 輸出配置 ----- dist/app.js
    path: __dirname + '/dist', // 項目打包在dist目錄下
    filename: '[name].js' // [name] 表示變量,若是入口肯定名字app,輸出就是app.js
  },
  // ++++++++++++++++++
  plugins: [ // 添加插件 ---- 數組

  ]
}
  • cnpm i webpack@3 -D 基礎模塊 ---- 必須安裝

  • cnpm i html-webpack-plugin -D

const webpack = require('webpack'); // ++++++++++++++++
const HtmlWebPackPlugin = require('html-webpack-plugin');// ++++++++++++++++
module.exports = {
  // entry: './src/main.js' // string類型寫法
  entry: { // object 類型寫法 ---- 推薦寫法
    app: './src/main.js' // 會將本項目打包成爲一個js文件  app.js
  },
  output: { // 輸出配置 ----- dist/app.js
    path: __dirname + '/dist', // 項目打包在dist目錄下
    filename: '[name].js' // [name] 表示變量,若是入口肯定名字app,輸出就是app.js
  },
  plugins: [ // 添加插件 ---- 數組
    // ++++++++++++++++++++++++++
    new HtmlWebPackPlugin({ // 實例化一個 html 的webpack的插件
      template: 'index.html' // 找的就是當前文件夾下的index.html文件
    })
  ]
}

從新執行webpack指令,發現dist文件夾下生成一個index.html文件,而且自動引入了生成的js文件

2.8 打包項目前先壓縮js文件 - 插件

  • 複製頁面引入js前添加壓縮js插件
plugins: [ // 添加插件 ---- 數組
    // ++++++++++++++  無需安裝額外模塊,基於webpack的基礎模塊
    new webpack.optimize.UglifyJsPlugin(), // 壓縮js文件
    new HtmlWebPackPlugin({ // 實例化一個 html 的webpack的插件
      template: 'index.html' // 找的就是當前文件夾下的index.html文件
    })
  ]

控制檯運行webpack,從新打包查看app.js已爲壓縮過的js文件

三、js文件中引入css文件 ---- css文件做爲模塊使用

3.1 建立src/main.css

html {
  background-color: #f66;
}

3.2 src/main.js處引入css文件

import './main.css'; // +++++++++++++++++++
console.log('hello webpack')

運行命令webpack,發現如下錯誤,須要安裝合適解析器去解析css模塊語法

ERROR in ./src/main.css
Module parse failed: Unexpected token (1:5)
You may need an appropriate loader to handle this file type.

3.3 配置webpack的解析器

const webpack = require('webpack');
const HtmlWebPackPlugin = require('html-webpack-plugin');
module.exports = {
  // entry: './src/main.js' // string類型寫法
  entry: { // object 類型寫法 ---- 推薦寫法
    app: './src/main.js' // 會將本項目打包成爲一個js文件  app.js
  },
  output: { // 輸出配置 ----- dist/app.js
    path: __dirname + '/dist', // 項目打包在dist目錄下
    filename: '[name].js' // [name] 表示變量,若是入口肯定名字app,輸出就是app.js
  },
  plugins: [ // 添加插件 ---- 數組
    new webpack.optimize.UglifyJsPlugin(), // 壓縮js文件
    new HtmlWebPackPlugin({ // 實例化一個 html 的webpack的插件
      template: 'index.html' // 找的就是當前文件夾下的index.html文件
    })
  ],
  // +++++++++++++++++++
  module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標....
    rules: [ // 解析器規則

    ]
  }
}

3.4 安裝css模塊的解析器

cnpm i style-loader css-loader@0 -D

3.5 配置css的解析器

module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標....
    rules: [ // 解析器規則
      {
        test: /\.css$/, // 處理的是以css爲結尾的css模塊
        loader: 'style-loader!css-loader' // 從右到左解析,將css文件由css-laoder轉換成樣式表,將樣式表由style-loader添加到dist/index.html內,在查看頁面效果時纔可見 --- 渲染到了頁面中的head標籤內部
      }
    ]
  }

四、scss模塊解析器配置

cnpm i node-sass sass-loader@7 -D

  • 建立src/main.scss文件
html {
  background: #00f;
}
  • src/main.js引入scss文件
import './main.scss';
console.log('hello webpack')
  • 報錯 同上

  • 添加scss配置信息
module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標....
    rules: [ // 解析器規則
      {
        test: /\.css$/, // 處理的是以css爲結尾的css模塊
        loader: 'style-loader!css-loader' // 從右到左解析,將css文件由css-laoder轉換成樣式表,將樣式表由style-loader添加到dist/index.html內,在查看頁面效果時纔可見 --- 渲染到了頁面中的head標籤內部
      },
      // +++++++++++++++++++++
      {
        test: /\.scss$/,
        loader: 'style-loader!css-loader!sass-loader'
      }
    ]
  }

運行webpack,瀏覽頁面,發現爲藍色,代表scss配置成功

五、less模塊解析器配置

cnpm i less less-loader -D

  • 建立src/main.less文件
html {
  background: #0f0;
}
  • src/main.js引入less文件
import './main.less';
console.log('hello webpack')
  • 報錯 同上

  • 添加scss配置信息
module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標....
    rules: [ // 解析器規則
      {
        test: /\.css$/, // 處理的是以css爲結尾的css模塊
        loader: 'style-loader!css-loader' // 從右到左解析,將css文件由css-laoder轉換成樣式表,將樣式表由style-loader添加到dist/index.html內,在查看頁面效果時纔可見 --- 渲染到了頁面中的head標籤內部
      },
      {
        test: /\.scss$/,
        loader: 'style-loader!css-loader!sass-loader'
      },
      // +++++++++++++++++++
      {
        test: /\.less$/,
        loader: 'style-loader!css-loader!less-loader'
      }
    ]
  }

運行webpack,瀏覽頁面,發現爲綠色,代表less配置成功

六、stylus模塊解析器配置

cnpm i stylus stylus-loader -D

  • 建立src/main.stylus文件
html{
  background: #000;
}
  • src/main.js引入stylus文件
import './main.stylus';
console.log('hello webpack')
  • 報錯 同上

  • 添加stylus配置信息
module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標....
    rules: [ // 解析器規則
      {
        test: /\.css$/, // 處理的是以css爲結尾的css模塊
        loader: 'style-loader!css-loader' // 從右到左解析,將css文件由css-laoder轉換成樣式表,將樣式表由style-loader添加到dist/index.html內,在查看頁面效果時纔可見 --- 渲染到了頁面中的head標籤內部
      },
      {
        test: /\.scss$/,
        loader: 'style-loader!css-loader!sass-loader'
      },
      {
        test: /\.less$/,
        loader: 'style-loader!css-loader!less-loader'
      },
      // +++++++++++++++++++
      {
        test: /\.stylus$/,
        loader: 'style-loader!css-loader!stylus-loader'
      }
    ]
  }

運行webpack,瀏覽頁面,發現爲黑色,代表stylus配置成功

七、配置js的解析器

其實最重要的就是解析js的高級語法,讓他能夠在瀏覽器中訪問

cnpm i babel-core@6 babel-loader@7 -D

若是要使用js最新的語法,那麼須要安裝相應的模塊而且配置

env 包含了 es2015 以及 es7.....

cnpm i babel-preset-es2015 babel-preset-env -D

若是須要作react應用,還需安裝模塊

cnpm i babel-preset-react -D

根目錄下建立 文件 .babelrc, 文件能夠省,可是配置不能省,省是配置到了webpack的配置文件

{
  "presets": ["es2015", "env", "react"]
}

添加js的解析器

module: { // 各種解析器 css / scss/ less/ stylus / 背景圖片 / 字體圖標....
    rules: [ // 解析器規則
      {
        test: /\.css$/, // 處理的是以css爲結尾的css模塊
        loader: 'style-loader!css-loader' // 從右到左解析,將css文件由css-laoder轉換成樣式表,將樣式表由style-loader添加到dist/index.html內,在查看頁面效果時纔可見 --- 渲染到了頁面中的head標籤內部
      },
      {
        test: /\.scss$/,
        loader: 'style-loader!css-loader!sass-loader'
      },
      {
        test: /\.less$/,
        loader: 'style-loader!css-loader!less-loader'
      },
      {
        test: /\.stylus$/,
        loader: 'style-loader!css-loader!stylus-loader'
      },
      // +++++++++++++++++++++++++++++++
      {
        test: /\.js$/,
        loader: 'babel-loader'
      }
    ]
  }

八、媒體文件、字體文件、背景圖片解析器的配置

cnpm / npm i file-loader url-loader -D

添加相關配置信息

{
  test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
  loader: 'url-loader',
  options: {
    limit: 10000,
    name: path.posix.join('static','img/[name].[hash:7].[ext]')
  }
},
{
  test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
  loader: 'url-loader',
  options: {
    limit: 10000,
    name: path.posix.join('static', 'media/[name].[hash:7].[ext]')
  }
},
{
  test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
  loader: 'url-loader',
  options: {
    limit: 10000,
    name: path.posix.join('static', 'fonts/[name].[hash:7].[ext]')
  }
}

九、webpack開發服務器

  • vue 項目中 npm run serve 啓動開發者服務器

  • webpack 能夠配置開發者服務器

cnpm i webpack-dev-server@2 -g

cnpm i webpack-dev-server@2 -D

控制檯運行 webpack-dev-server 指令,查看效果

修改代碼繼續查看效果,發現代碼會自動更新

十、配置開發者服務器

10.1 數據請求

cnpm i axios -S

src/main.js 處請求數據,遇到跨域問題

import './main.css';
import axios from 'axios';
console.log('hello webpack! 開發者服務器')
axios.get('http://47.92.152.70/pro').then(res => {
  console.log(res.data)
})
  • 添加webpack的配置選項 devServer
devServer: { // 開發者服務器配置
    host: '0.0.0.0', // 默認值是127.0.0.1,改成0.0.0.0以後局域網內能夠經過ip地址訪問
    port: 8080, // 默認訪問服務器的端口號
    // open: true, // 打開默認瀏覽器,通常設置爲false
    proxy: { // 解決跨域問題
      '/api': {
        target: 'http://47.92.152.70', // 代理哪個服務器
        changeOrigin: true, // 代理
        pathRewrite: {
          '^/api': '' // 以 /api 開頭的請求,認爲就是請求的代理
          // /api/pro   ===> http://47.92.152.70/pro
        }
      }
    }
  }

修改請求代碼,查看效果

axios.get('/api/pro').then(res => {
  console.log(res.data)
})

十一、添加服務器的啓動命令

  • package.json文件中添加scripts選項
"scripts": {
  "dev": "webpack-dev-server",
  "build": "webpack"
},

十二、配置@符號

resolve: {
  extensions: ['.js', '.vue', '.jsx'], // 表明缺省的後綴名,引入時能夠省略的後綴名 --- import axios from './request'; 而不用 import axios from './request.js';
  alias: { // 別名
    '@': path.join(__dirname, './', 'src') // src 的別名爲 @
  }
}

1三、webpack + vue

webpack配置別名

resolve: {
    extensions: ['.js', '.vue', '.jsx'], // 表明缺省的後綴名,引入時能夠省略的後綴名 --- import axios from './request'; 而不用 import axios from './request.js';
    alias: { // 別名
      '@': path.join(__dirname, './', 'src'), // src 的別名爲 @
      // +++++++++++++++++++++++++++
      'vue$': 'vue/dist/vue.esm.js' // 打包vue項目必須得寫的別名
    }
  }
  • 安裝vue的依賴

cnpm i vue -S

cnpm i vue-loader@14 vue-template-compiler -D

配置vue文件的解析器

{
  test: /\.vue$/,
  loader: 'vue-loader'
}

剩下的就是普通的vue的項目開發

1四、初體驗react

cnpm i react react-dom -S

1五、複習es6的語法

15.1 es6 class

補充webpack配置

經過運行不一樣的命令,表示不一樣的環境

cnpm i cross-env -D

修改packages.json

"scripts": {
    "dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack.config.js",
    "build": "cross-env NODE_ENV=production webpack --config webpack.config.js"
  },

修改webpack.config.js

const isDev = process.env.NODE_ENV =='development'
plugins: [ // 添加插件 ---- 數組
  new webpack.optimize.UglifyJsPlugin(), // 壓縮js文件
  new webpack.DefinePlugin({ // ++++++++++++++
    'process.env':{
      NODE_ENV:isDev?'"development"':'"production"',
    }
  }),
  new HtmlWebPackPlugin({ // 實例化一個 html 的webpack的插件
    template: 'index.html' // 找的就是當前文件夾下的index.html文件
  })
],
相關文章
相關標籤/搜索