We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
// install cli $ npm install rppx-cli -g // 创建项目 $ rppx init my-react // 安装依赖包 $ npm install // 开发 $ npm run dev // 编译打包 npm run build // 启动生产页面 npm start
新创建页面在src下添加文件夹并创建pageinfo.json 然后npm run dev 即可
pageinfo.json
npm run dev
|-- src |-- index/ |-- page2/ |-- index.js |-- pageinfo.json
react16
webpack4
html-webpack-plugin 生成html文件
mini-css-extract-plugin css分离打包
uglifyjs-webpack-plugin js压缩
optimize-css-assets-webpack-plugin css压缩
es6
babel
sass
bulma
react-redux
node
opn 打开浏览器
compression 开启gzip压缩
express
fs
progress
git
|-- react-multi-page-app //项目 |-- build //编译生产目录 |-- index |-- index.css |-- index.js |-- todo |-- todo.css |-- todo.js |-- index.html |-- images |-- index.html |-- node_modules //node包 |-- src //开发目录 |-- pages |-- index |-- index.js // 页面打包入口文件(必须) |-- todo |-- utils.js |-- common.scss |-- template.html // html模版 |-- config //在webpack中使用 |-- get-entry.js //获取入口 |-- get-path.js //src下需要打包页面文件夹 |-- html-config.js //每个页面html注入数据 |-- package.json |-- .gitignore |-- webpack.config.js //webpack配置文件 |-- www.js //生产启动程序
webpack在单页面打包上应用广泛,以create-react-app为首的接触脚手架众多,单页面打包通常指的是将业务js,css打包到同一个html文件中,整个项目只有一个html文件入口
webpack.config.js
module.exports = (env, argv) => ({ entry: ".src/index.js", output: { path: path.join(__dirname, "dist"), filename: "bundle.js" }, module: { rules: [ ... ], }, plugins: [ new HtmlWebpackPlugin({ title: "首页", filename:"index.html", favicon:"", template: "./src/template.html", }) ] });
这样就可以在dist文件夹下打包出一个下面这样的文件
dist
<!DOCTYPE html> <html lang="en"> <head> <title>首页</title> <body> <div id="root"></div> <script type="text/javascript" src="bundle.js"></script></body> </html>
webpack 的entry支持两种种格式
module.exports = { entry: '.src/file.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' } };
这样就会在dist下打包出一个bundle.js
module.exports = { entry: { index:"./src/index.js", about:"./src/about.js" }, output: { path: path.resolve(__dirname, 'dist'), filename: '[name].js' index.js,about.js这两个文件 } };
上面在dist下打包出两个与entry属性名对应的js文件
这里我们需要用到html-webpack-plugin这个webpack插件,每添加一个页面就需要在plugins添加一个new HtmlWebpackPlugin({....})
html-webpack-plugin
new HtmlWebpackPlugin({....})
const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = (env, argv) => ({ entry: { index:"./src/index.js", about:"./src/about.js" }, output: { path: path.resolve(__dirname, 'dist'), filename: '[name].js' index.js,about.js这两个文件 } ....//其他配置 plugins: [ new HtmlWebpackPlugin( { filename:"index.html",//生成的index.html template: "./src/template.html",}) //模板 chunks:["index"] }), new HtmlWebpackPlugin( { filename:"about.html",//生成的index.html template: "./src/template.html",}) //模板 chunks:["index"] }) ] })
html-webpack-plugin 会通过 template.html 模板生成对应的filename名的html文件,并一并打包到output中对应的文件夹下,注意,在没有特殊配置的情况下所有打包的文件都是对应到output中 path 这个目录下,也包括html。这里的 chunks 需要注意,它是确定该html需要引入哪个js,如果没写的话,默认会引出所有打包的js,当然这不是我们想要的。
template.html
path
chunks
上面的配置最终可以在dist下打包出下面的文件结构
|-- dist |-- index.js |-- about.js |-- index.html //内挂载index.js |-- about.html //内挂载about.js
通过上面这样的配置,再加上devServer,我们已经可以实现多页面的配置开发了,但这样很不智能,因为你每增加一个页面,就要在wepback里面配置一次,会非常繁琐,所以我们来优化下,让我们只专注于开发页面,配置交给webpack自己.
我们再看下src下面的文件结构
|-- src |-- index |-- app.js |-- index.scss |-- index.js |-- about |-- app.js |-- index.scss |-- index.js
src下面每个文件夹对应一个html页面的js业务,如果我们直接把文件夹对应入口js找到并把他们合并生成对应的entry,那是不是就不用手动写entry了呢,是的!
/* eslint-env node */ /** * @project: 遍历文件目录 * @author: leinov * @date: 2018-10-11 */ const fs = require("fs"); /** * 【遍历某文件下的文件目录】 * * @param {String} path 路径 * @returns {Array} ["about","index"] */ module.exports = function getPath(path){ let arr = []; let existpath = fs.existsSync(path); //是否存在目录 if(existpath){ let readdirSync = fs.readdirSync(path); //获取目录下所有文件 readdirSync.map((item)=>{ let currentPath = path + "/" + item; let isDirector = fs.statSync(currentPath).isDirectory(); //判断是不是一个文件夹 if(isDirector){ // component目录下为组件 需要排除 arr.push(item); } }); return arr; } }; };
比如在src下有index页面项目,about项目 遍历结果为["index","about"];
/* eslint-env node */ /** * @project: 获取entry文件入口 * @author: leinov * @date: 2018-10-11 * @update: 2018-11-04 优化入口方法 调用getPath */ const getPath = require("./get-path"); /** * 【获取entry文件入口】 * * @param {String} path 引入根路径 * @returns {Object} 返回的entry { "about/aoubt":"./src/about/about.js",...} */ module.exports = function getEnty(path){ let entry = {}; getPath(path).map((item)=>{ /** * 下面输出格式为{"about/about":".src/aobout/index.js"} * 这样目的是为了将js打包到对应的文件夹下 */ entry[`${item}/${item}`] = `${path}/${item}/index.js`; }); return entry; };
这里我们使用getFilepath获取的数组,在获取到每个目录下的js文件,组合成一个js入口文件的如下格式的对象。
{ "index/index":"./src/index/index.js", "todo/todo":"./src/todo/index.js" }
const getEntry = require("./webpackConfig/get-entry"); const entry = getEntry(); module.exports = (env, argv) => ({ entry: entry, })
这样我们就自动获取到了entry
因为每个页面都需要配置一个html,而且每个页面的标题,关键字,描述等信息可能不同,所以我们在每个页面文件夹下创建一个pageinfo.json,通过fs模块获取到json里信息再遍历到对应得html-webpack-plugin中生成一个html插件数组。
index/pageinfo.json 生成index.html页面信息
index/pageinfo.json
index.html
{ "title":"首页", "keywords":"webpack多页面" }
todo/pageinfo.json 生成todo.html页面信息供
todo/pageinfo.json
todo.html
{ "title":"todo list", "keywords":"todolist react" }
通过fs遍历读取并生成HtmlWebpackPlugin数组供webpack使用
/** * @file 页面html配置 * @author:leinov * @date: 2018-10-09 * @update: 2018-11-05 * @use: 动态配置html页面,获取src下每个文件下的pageinfo.json内容,解析到HtmlWebpackPlugin中 */ const fs = require("fs"); const HtmlWebpackPlugin = require("html-webpack-plugin");//生成html文件 const getPath = require("./get-path"); let htmlArr = []; function createHtml(page_path){ getPath(page_path).map((item)=>{ let infoJson ={},infoData={}; try{ // 读取pageinfo.json文件内容,如果在页面目录下没有找到pageinfo.json 捕获异常 infoJson = fs.readFileSync(`${page_path}/${item}/pageinfo.json`,"utf-8");// infoData = JSON.parse(infoJson); }catch(err){ infoData = {}; } htmlArr.push(new HtmlWebpackPlugin({ title:infoData.title ? infoData.title : "webpack,react多页面架构", meta:{ keywords: infoData.keywords ? infoData.keywords : "webpack,react,github", description:infoData.description ? infoData.description : "这是一个webpack,react多页面架构" }, chunks:[`${item}/${item}`], //引入的js template: "./src/template.html", filename : item == "index" ? "index.html" : `${item}/index.html`, //html位置 minify:{//压缩html collapseWhitespace: true, preserveLineBreaks: true }, })); }); return htmlArr; } module.exports = createHtml;
const path = require("path"); const createHtml =require("./config/create-html");// html配置 const getEntry = require("./config/get-entry"); const entry = getEntry("./src/pages"); const htmlArr = createHtml("./src/pages"); module.exports = (env, argv) => ({ entry: entry output: { path: path.resolve(__dirname, 'dist'), filename: '[name].js' } ....//其他配置 devServer: { port: 3100, open: true, }, plugins: [ ...htmlArr ] })
这样一个自动化完整的多页面架构配置就完成了,如果我们要新创建一个页面
index.js
The text was updated successfully, but these errors were encountered:
这框架要使用组件按需加载如何配置,指点一下
Sorry, something went wrong.
这个解析css文件报错
你就不能好好封装下?
No branches or pull requests
react多页面应用架构及使用
概览
特性
安装&使用
新创建页面在src下添加文件夹并创建
pageinfo.json
然后npm run dev
即可技术使用
react16
webpack4
html-webpack-plugin 生成html文件
mini-css-extract-plugin css分离打包
uglifyjs-webpack-plugin js压缩
optimize-css-assets-webpack-plugin css压缩
es6
babel
sass
&bulma
react-redux
node
opn 打开浏览器
compression 开启gzip压缩
express
fs
&progress
git
目录结构
实现
webpack打包单页面应用
webpack在单页面打包上应用广泛,以create-react-app为首的接触脚手架众多,单页面打包通常指的是将业务js,css打包到同一个html文件中,整个项目只有一个html文件入口
webpack单页面打包配置
webpack.config.js
这样就可以在
dist
文件夹下打包出一个下面这样的文件webpack多页面打包配置
webpack 的entry支持两种种格式
打包单个文件
这样就会在dist下打包出一个bundle.js
打包出多个文件
上面在dist下打包出两个与entry属性名对应的js文件
将每个js挂载到相应的html文件上
这里我们需要用到
html-webpack-plugin
这个webpack插件,每添加一个页面就需要在plugins添加一个new HtmlWebpackPlugin({....})
html-webpack-plugin
会通过template.html
模板生成对应的filename名的html文件,并一并打包到output中对应的文件夹下,注意,在没有特殊配置的情况下所有打包的文件都是对应到output中path
这个目录下,也包括html。这里的chunks
需要注意,它是确定该html需要引入哪个js,如果没写的话,默认会引出所有打包的js,当然这不是我们想要的。上面的配置最终可以在dist下打包出下面的文件结构
通过上面这样的配置,再加上devServer,我们已经可以实现多页面的配置开发了,但这样很不智能,因为你每增加一个页面,就要在wepback里面配置一次,会非常繁琐,所以我们来优化下,让我们只专注于开发页面,配置交给webpack自己.
webpack多页面配置优化
我们再看下src下面的文件结构
src下面每个文件夹对应一个html页面的js业务,如果我们直接把文件夹对应入口js找到并把他们合并生成对应的entry,那是不是就不用手动写entry了呢,是的!
遍历文件目录
比如在src下有index页面项目,about项目 遍历结果为["index","about"];
遍历生成打包入口数组
这里我们使用getFilepath获取的数组,在获取到每个目录下的js文件,组合成一个js入口文件的如下格式的对象。
在webpack中使用get-entry
这样我们就自动获取到了entry
html-webpack-plugin自动配置
因为每个页面都需要配置一个html,而且每个页面的标题,关键字,描述等信息可能不同,所以我们在每个页面文件夹下创建一个pageinfo.json,通过fs模块获取到json里信息再遍历到对应得html-webpack-plugin中生成一个html插件数组。
index/pageinfo.json
生成index.html
页面信息todo/pageinfo.json
生成todo.html
页面信息供通过fs遍历读取并生成HtmlWebpackPlugin数组供webpack使用
遍历html插件数组
wbpack终极配置
这样一个自动化完整的多页面架构配置就完成了,如果我们要新创建一个页面
index.js
(必须,因为是webpack打包入口文件)pageinfo.json
(非必须) 供html插件使用npm run dev
开发完整代码参考项目code
The text was updated successfully, but these errors were encountered: