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 相关文章推荐
javascript与webservice的通信实现代码
Dec 25 Javascript
JQuery select控件的相关操作实现代码
Sep 14 Javascript
JSON无限折叠菜单编写实例
Dec 16 Javascript
jQuery实用函数用法总结
Aug 29 Javascript
Javascript获取CSS伪元素属性的实现代码
Sep 28 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
Feb 21 Javascript
JavaScript模板引擎Template.js使用详解
Dec 15 Javascript
javascript中闭包概念与用法深入理解
Dec 15 Javascript
JS字符串false转boolean的方法(推荐)
Mar 08 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
Aug 31 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
Dec 21 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
Jan 21 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
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
来自phpguru得Php Cache类源码
2010/04/15 PHP
php实现统计邮件大小的方法
2013/08/06 PHP
php中使用url传递数组的方法
2015/02/11 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
刷新时清空文本框内容的js代码
2007/04/23 Javascript
Javascript 中的类和闭包
2010/01/08 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
Bootstrap CSS布局之图像
2016/12/17 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
QML用PathView实现轮播图
2020/06/03 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
css3实现动画的三种方式
2020/08/24 HTML / CSS
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
anello泰国官方网站:日本流行包包品牌
2019/08/08 全球购物
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
十岁生日同学答谢词
2014/01/19 职场文书
医院检讨书范文
2014/02/01 职场文书
酒店行政人事部经理职务说明书
2014/02/26 职场文书
法制宣传月活动方案
2014/05/11 职场文书
工资证明范本
2015/06/12 职场文书
《火烧云》教学反思
2016/02/23 职场文书
竞选稿之小学班干部
2019/10/31 职场文书