热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:React多页面应用4(webpack自动化生成多入口页面)

本文由编程笔记#小编为大家整理,主要介绍了React多页面应用4(webpack自动化生成多入口页面)相关的知识,希望对你有一定的参考价值。1
本文由编程笔记#小编为大家整理,主要介绍了React多页面应用4(webpack自动化生成多入口页面)相关的知识,希望对你有一定的参考价值。




1.React多页面应用1(webpack开发环境搭建,包括Babel热更新等) ----2017.12.28


2.React多页面应用2(处理CSS及图片,引入postCSS及图片处理等)----2017.12.29


3.React多页面应用3(webpack性能提升,包括打包性能、提取公共包等)----2017.12.30


4.React多页面应用4(webpack自动化生成多入口页面)----2017.12.31


5.React多页面应用5(webpack生产环境配置,包括压缩js代码,图片转码等)----2018.01.01


6.React多页面应用6(gulp自动化发布到多个环境,生成版本号,打包成zip等)----2018.01.02


7.React多页面应用7(引入eslint代码检查)----2018.01.03


开发环境:Windows 8,node v8.9.1,npm 5.5.1,WebStorm 2017.2.2


在之前课程中,我们发现,有很多重复劳动

如:

我们需要手动新建webpack入口文件

再 entryBuild 文件夹中新建,每个页面的js文件

index.js

React多页面应用4(webpack自动化生成多入口页面)

shop.js

React多页面应用4(webpack自动化生成多入口页面)


这两个文件 几乎是一样的

React多页面应用4(webpack自动化生成多入口页面)


然后还需要在 build 文件夹中建立

两个对应的 html文件

index.html

React多页面应用4(webpack自动化生成多入口页面)


shop.html


React多页面应用4(webpack自动化生成多入口页面)

这两个文件几乎也是一样的

React多页面应用4(webpack自动化生成多入口页面)

顺便还有一个问题就是 

title 如何设置?

描述 和 关键词 如何设置?

我们现在来解决这些问题!!!!!!!!!!




  1. 设置 entry 入口文件

    我们在 config 文件夹中 新建 entry.js ,以后我们新建页面,只需要在这里添加即可

    path路径 会指向到 app->component 目录下


let entry = [
{
name: 'index',
       path: 'index/Index.jsx',
       title: '首页',
       keywords: '首页,xxx',
       description: '这是我们的首页'
   },
   {
name: 'shop',
       path: 'shop/Index.jsx',
       title: '商城',
       keywords: '商城,xxx',
       description: '这是我们的商城'
   }
];
module.exports = entry;

React多页面应用4(webpack自动化生成多入口页面)


2.接下来 我们要实现 自动化 生成 , webpack 的入口文件js,和html文件

在这之前我们需要写几个公共方法!

在config下,新建common

建立copyFile.js

// js/app.js:指定确切的文件名。
// js/*.js:某个目录所有后缀名为js的文件。
// js/**/*.js:某个目录及其所有子目录中的所有后缀名为js的文件。
// !js/app.js:除了js/app.js以外的所有文件。
// *.+(js|css):匹配项目根目录下,所有后缀名为js或css的文件。

//流 stream   管道 pipe 管道
//如果想在读取流和写入流的时候做完全的控制,可以使用数据事件。但对于单纯的文件复制来说读取流和写入流可以通过管道来传输数据。
/*
* 复制目录中的所有文件包括子目录
* @src param{ String } 需要复制的目录   例 images 或者 ./images/
* @dst param{ String } 复制到指定的目录    例 images images/
*/
const fs = require("fs");
const path = require("path");
//获取当前目录绝对路径,这里resolve()不传入参数
const filePath = path.resolve();

const copy = function(src,dst){
//判断文件需要时间,则必须同步
   if(fs.existsSync(src)){
fs.readdir(src,function(err,files){
if(err){console.log(err);return;}
files.forEach(function(filename){
//url+"/"+filename不能用/直接连接,Unix系统是”/“,Windows系统是”\“
               var url = path.join(src,filename),
                   dest = path.join(dst,filename);
               console.log(url);
               console.log(dest);
               fs.stat(path.join(src,filename),function(err, stats){if (err) throw err;

                   //是文件
                   if(stats.isFile()){
//创建读取流
                       readable = fs.createReadStream(url);
                       //创建写入流
                       writable = fs.createWriteStream(dest,{ encoding: "utf8" });
                       // 通过管道来传输流
                       readable.pipe(writable);

                       //如果是目录
                   }else if(stats.isDirectory()){ exists( url, dest, copy );
                   }
});
           });
       });
   }else{
console.log("给定的目录不存,读取不到文件");
       return;
   }
};

function exists(url,dest,callback){
fs.exists(dest,function(exists){
if(exists){
callback && callback(url,dest);
       }else{
//第二个参数目录权限 ,默认0777(读写权限)
           fs.mkdir(dest,0777,function(err){
if (err) throw err;
               callback && callback(url,dest);
           });
       }
});
}
module.exports = copy;

建立deleteFile.js

const fs = require("fs");
const deleteFolderRecursive = function (path) {
if (fs.existsSync(path)) {
fs.readdirSync(path).forEach(function (file, index) {
let curPath = path + "/" + file;
           if (fs.lstatSync(curPath).isDirectory()) { // recurse
               deleteFolderRecursive(curPath);
           } else { // delete file
               fs.unlinkSync(curPath);
           }
});
       fs.rmdirSync(path);
   }
};

module.exports = deleteFolderRecursive;

建立 imgDel.js

let fs = require('fs');
let join = require('path').join;

/**
*
* @param startPath  起始目录文件夹路径
* @returns {Array}
*/
function findSync(startPath) {
let result = [];

   function finder(path) {
let files = fs.readdirSync(path);
       files.forEach((val, index) => {
let fPath = join(path, val);
           let stats = fs.statSync(fPath);
           if (stats.isDirectory()) finder(fPath);
           if(val.indexOf('png') !==-1 ||val.indexOf('gif') !==-1 || val.indexOf('jpg') !==-1){
if (stats.isFile()) result.push(val.substring(0,val.length - 12));
           }
});

   }
finder(startPath);
   return result;
}
let fileNames = findSync('pc/resource/');
console.log(fileNames);

建立 nodeCommon.js

const deleteFile = require("./deleteFile");
const copyFile = require("./copyFile");
module.exports = {
deleteFile,
   copyFile
};

建完后目录结构如下

React多页面应用4(webpack自动化生成多入口页面)


3.新建entryBuild.js

const fs = require("fs");
const path = require("path");
const entry = require('./entry');
const nodeCommon = require('../common/nodeCommon');

const entryBuildPath = path.resolve(__dirname, '../../entryBuild');
nodeCommon.deleteFile(entryBuildPath);
fs.mkdirSync(entryBuildPath);

const entryContent = (data) => {
let cOnt= ``;
   return `
import React from 'react';
import ReactDOM from 'react-dom';
import Index from '../app/component/${data.path}';
ReactDOM.render(${cont},document.getElementById('app'));
   `
};
/*生成webpack entry 入口文件*/
entry.map((data) => {
fs.writeFile(entryBuildPath + '/' + data.name + '.js', entryContent(data), 'utf8', function (err) {
if (err) {
return console.log(err);
       }
});
});

React多页面应用4(webpack自动化生成多入口页面)

4.修改 package.json 

"entry": "node config/entry/entryBuild.js",

React多页面应用4(webpack自动化生成多入口页面)

我们现在 删除 entryBuild 文件夹

React多页面应用4(webpack自动化生成多入口页面)

然后 执行 npm run entry

看下 是不是 创建了 entryBuild  文件夹 及 index.js shop.js

执行 npm run dev 

一切正常


5.接下来我们自动化生成 html文件

我们需要建立一个模版 比如叫 index.html

放在根目录下

html>
lang="en">

   charset="UTF-8">
   http-equiv="X-UA-Compatible" cOntent="IE=edge">
   cOntent="telephOne=no" name="format-detection">
   


id="app">


React多页面应用4(webpack自动化生成多入口页面)

6.建立几个公用webpack js文件

webpack.com.conf.js

let titleFun = function(chunkName,title){
let titleDef = 'XXX网站';
   if(chunkName.indexOf('index') !==-1){
return titleDef;
   }else{
return title + '_' + titleDef;
   }
};
module.exports = {
titleFun:titleFun
};

React多页面应用4(webpack自动化生成多入口页面)


添加依赖 

npm i -D copy-webpack-plugin clean-webpack-plugin

修改  webpack.file.conf.js 文件

const path = require("path");
const CopyWebpackPlugin = require('copy-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

function cleanFun(arr) {
return (new CleanWebpackPlugin(arr, {root: path.resolve(__dirname, '../../'), verbose: true, dry: false}))
}
let copyObj = [
/*{from: './app/public/plugin', to: './plugin'},
   {from: './app/public/versionTips', to: './versionTips'},
   {from: './app/public/file', to: './resource'},
   {from: './app/public/img/favicon.ico', to: './'},*/
];

let copyArr = [];
copyObj.map((data) => {
copyArr.push(
new CopyWebpackPlugin([{from: data.from, to: data.to, ignore: ['.*']}])
)
});


module.exports = {
devDirectory: 'build', /*开发目录*/
   proDirectory: 'pc', /*发布目录*/
   resource: 'resource', /*静态资源*/
   resourcePrefix: '/static/pc/', /*线上静态资源前缀*/
   cleanFun: cleanFun,
   copyArr: copyArr,
   copyObj: copyObj
};



7.新建 webpack.devBuildHtml.conf.js

const fs = require("fs");
const nodeCommon = require("../common/nodeCommon");
const webpackFile = require("./webpack.file.conf");
const entryBuild = require('../entry/entry');
const webpackComCOnf= require('./webpack.com.conf');
/*删除构建目录*/
nodeCommon.deleteFile(webpackFile.devDirectory);
/*创建构建目录*/
fs.mkdirSync(webpackFile.devDirectory);
webpackFile.copyObj.map((data) => {
let to = webpackFile.devDirectory + data.to.substring(1, data.to.length);
   if (data.to !== './') {
fs.mkdirSync(to);
   }
nodeCommon.copyFile(data.from, to);
});
/*生成HTML*/
let htmlCOnt= fs.readFileSync("index.html", "utf-8");
let scriptInsert = `




`;
htmlCOnt= htmlCont.replace('', scriptInsert + '');
entryBuild.map((data) => {
fs.writeFile(webpackFile.devDirectory + '/' + data.name + '.html',
       htmlCont.replace('js/key.js', 'js/' + data.name + '.js').replace('<%= htmlWebpackPlugin.options.title %>', webpackComConf.titleFun(data.name,data.title)),
       'utf8',
       function (err) {
if (err) {
return console.log(err);
           }
});
});

React多页面应用4(webpack自动化生成多入口页面)

8.修改package.json

"devBuildHtml": "node config/webpack/webpack.devBuildHtml.conf.js",

React多页面应用4(webpack自动化生成多入口页面)

我们删除 根目录下的 build 文件夹,然后执行

npm run devBuildHtml

看下是否自动生成了 build 文件夹 和 index.html shop.html 文件

React多页面应用4(webpack自动化生成多入口页面)


9.添加 webpack.entry.conf.js

const entryBuild = require('../entry/entry');
let entry = {};
entryBuild.map((data) => {
entry[data.name] = ['./entryBuild/' + data.name + '.js', data.title];
});
module.exports = entry;

React多页面应用4(webpack自动化生成多入口页面)


10.改造webpack.base.conf.js   统一入口文件

const entry = require("./webpack.entry.conf");
const json = require('../../package.json');//引进package.json
const newEntry = {};
for (let name in entry) {
newEntry[name] = entry[name][0]
}
newEntry.vendor = Object.keys(json.dependencies); //把 package.json dependencies字段的值放进 vendor中
let cOnfig= {
entry: newEntry,
   resolve: {
extensions: [".js", ".json", ".jsx", ".css", ".pcss"],
   }
};
module.exports = config;


11.运行

npm run dev

一切OK


12.再往前走一步

修改 package.json

"devNew": "npm run entry && npm run devBuildHtml",


React多页面应用4(webpack自动化生成多入口页面)



以后我们再有新页面,只需要在 config\entry\entry.js中添加就可以了

(目前 关键词,描述, 我们有去实现,也好实现,只是我们现在不太关注SEO,我只是预留了这个功能)

React多页面应用4(webpack自动化生成多入口页面)


然后 我们只需要

有新页面的时候执行

npm run devNew

再执行

npm run dev

愉快的开发吧~~~~~~~~~~


本文完 React多页面应用4(webpack自动化生成多入口页面)React多页面应用4(webpack自动化生成多入口页面)React多页面应用4(webpack自动化生成多入口页面)React多页面应用4(webpack自动化生成多入口页面)React多页面应用4(webpack自动化生成多入口页面)


感谢童鞋们支持!

欢迎童鞋留言!



推荐阅读
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何压缩网站页面以减少页面加载时间
    本文介绍了影响网站打开时间的两个因素,即网页加载速度和网站页面大小。重点讲解了如何通过压缩网站页面来减少页面加载时间。具体包括图片压缩、Javascript压缩、CSS压缩和HTML压缩等方法,并推荐了相应的压缩工具。此外,还提到了一款Google Chrome插件——网页加载速度分析工具Speed Tracer。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
  • npmrunbuild后dist文件夹下面直接浏览器打开index.html,css和js的路径都不正确。放到跟目录下就正常了,iis上同样只能在根目录下。我项目的目录如下: ... [详细]
author-avatar
排骨冬菇面
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有