webpack构建react多页面应用详解


Posted in Javascript onSeptember 15, 2017

写这个的初衷是很难找一个简洁的项目脚手架,很多脚手架都有很多依赖,光看依赖就要很久,所以自己参照网上的内容,弄个这么一个简单的多页面的脚手架。

利用creat-react-app 新建一个react应用

npm install -g create-react-app

然后创建一个项目

create-react-app demo

create-react-app会自动初始化一个脚手架并安装 React 项目的各种必要依赖,如果在过程中出现网络问题,请用cnpm淘宝镜像安装。

然后我们进入项目并启动。

cd demo

然后启动项目

npm start

那就会看到如下页面

webpack构建react多页面应用详解

然后进入src/App.js,用下面代码替换App.js中的代码(因为在webpack中暂时不想处理图片和icon)

import React, { Component } from 'react';
import './App.css';

class App extends Component {
 render() {
  return (
   <div className="App">
    <div className="App-header">
     <h2>Welcome to App</h2>
    </div>
    <p className="App-intro">
     To get started, edit <code>src/App.js</code> and save to reload.
    </p>
   </div>
  );
 }
}

export default App

然后将 index.js 中的 内容替换为如下代码(删除registerServiceWorker)

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';


ReactDOM.render(<App />, document.getElementById('root'));

然后删除src下面的registerServiceWorker.js(该文件用于构建pwa应用用的,暂时我们用不了)和 logo.svg文件(不想处理图片文件)和 App.test.js(用于测试用的)。

现在src/下面有四个文件。接下来,在src下面新建两个文件夹 app1和 app2,分别将原来的四个文件拷贝进入app1和app2。文件目录如下:

webpack构建react多页面应用详解

接下来,进入public文件下,删除favicon.ico(不想处理)和 manifest.json(构建pwa用的),然后将index.html中的内容用如下内容替换

<!doctype html>
<html lang="en">
 <head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="theme-color" content="#000000">
  <title>React App</title>
 </head>
 <body>
  <noscript>
   You need to enable JavaScript to run this app.
  </noscript>
  <div id="root"></div>
 </body>
</html>

这个index.html就是我们的模版html。

进入正题,开始install webpack和配置webpack

1.安装依赖。将package.json文件用下面的文件替代

{
 "name": "demo",
 "version": "0.1.0",
 "private": true,
 "dependencies": {
  "react": "^15.6.1",
  "react-dom": "^15.6.1"
 },
 "devDependencies": {
  "babel-core": "^6.26.0",
  "babel-loader": "^7.1.2",
  "babel-preset-es2015": "^6.24.1",
  "babel-preset-react": "^6.24.1",
  "clean-webpack-plugin": "^0.1.16",
  "css-loader": "^0.28.7",
  "extract-text-webpack-plugin": "^3.0.0",
  "file-loader": "^1.0.0",
  "glob": "^7.1.2",
  "html-webpack-plugin": "^2.30.1",
  "postcss-loader": "^2.0.6",
  "style-loader": "^0.18.2",
  "url-loader": "^0.5.9",
  "webpack": "^3.5.6",
  "webpack-dev-server": "^2.8.1"
 },
 "scripts": {
  "start": "webpack-dev-server --open",
  "build": "webpack"
 }
}

2.删除当前目录中的node_modules,然后重新在控制台执行

npm i

3.在根目录下也就是/demo下新建一个webpack.config.js文件,写入如下代码

const webpack = require('webpack');
const glob = require('glob');
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

const webpackConfig = {
  entry: {},
  output:{
    path:path.resolve(__dirname, './dist/'),
    filename:'[name].[chunkhash:6].js'
  },
  //设置开发者工具的端口号,不设置则默认为8080端口
  devServer: {
    inline: true,
    port: 8181
  },
  module:{
    rules:[
      {
        test:/\.js?$/,
        exclude:/node_modules/,
        loader:'babel-loader',
        query:{
          presets:['es2015','react']
        }
      },
      {
        test: /\.(scss|sass|css)$/, 
        loader: ExtractTextPlugin.extract({fallback: "style-loader", use: "css-loader"})
      },
      
    ]
  },
  plugins: [
    new ExtractTextPlugin("[name].[chunkhash:6].css"),
    new CleanWebpackPlugin(
      ['dist'],  
      {
        root: __dirname,    




        verbose: true,    





        dry:   false    





      }
    )
  ],
};

// 获取指定路径下的入口文件
function getEntries(globPath) {
  const files = glob.sync(globPath),
   entries = {};
  files.forEach(function(filepath) {
    const split = filepath.split('/');
    const name = split[split.length - 2];
    entries[name] = './' + filepath;
  });
  return entries;
}
    
const entries = getEntries('src/**/index.js');

Object.keys(entries).forEach(function(name) {
  webpackConfig.entry[name] = entries[name];
  const plugin = new HtmlWebpackPlugin({
    filename: name + '.html',
    template: './public/index.html',
    inject: true,
    chunks: [name]
  });
  webpackConfig.plugins.push(plugin);
})

module.exports = webpackConfig;

4.然后用直接执行如下代码

npm run build

成功在dist中看到你的两个页面app1和app2.

如果要自己调试用直接启用npm run start,然后在localhost:8181/app1.html查看页面进行调试。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ext监听事件方法[初级篇]
Apr 27 Javascript
类似CSDN图片切换效果脚本
Sep 17 Javascript
jquery ajax提交表单数据的两种方式
Nov 24 Javascript
JS类的封装及实现代码
Dec 02 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
Nov 15 Javascript
JS画5角星方法介绍
Sep 17 Javascript
JavaScript数据结构与算法之集合(Set)
Jan 29 Javascript
AngularJS中$watch和$timeout的使用示例
Sep 20 Javascript
Javascript实现一朵从含苞到绽放的玫瑰
Mar 30 Javascript
详解可以用在VS Code中的正则表达式小技巧
May 14 Javascript
vue实现扫码功能
Jan 17 Javascript
JavaScript隐式类型转换代码实例
May 29 Javascript
详解Vue中一种简易路由传参办法
Sep 15 #Javascript
JavaScript实现换肤功能
Sep 15 #Javascript
jQuery实现火车票买票城市选择切换功能
Sep 15 #jQuery
详解Vue.js Mixins 混入使用
Sep 15 #Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
Sep 15 #Javascript
Node.js实现连接mysql数据库功能示例
Sep 15 #Javascript
vue实现登陆登出的实现示例
Sep 15 #Javascript
You might like
php 数组的一个悲剧?
2011/05/11 PHP
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
学习ExtJS 访问容器对象
2009/10/07 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
js三种排序算法分享
2012/08/16 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
值得分享的轻量级Bootstrap Table表格插件
2016/05/30 Javascript
Bootstrap插件全集
2016/07/18 Javascript
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
如何在Python中实现goto语句的方法
2019/05/18 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
Python字符串的修改方法实例
2019/12/19 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
护士辞职信模板
2014/01/20 职场文书
销售主管岗位职责
2014/02/08 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
优秀学生干部主要事迹材料
2015/11/04 职场文书
Java实现简易的分词器功能
2021/06/15 Java/Android
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL