问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

node+react后台用webpack怎么做实时更新

发布网友 发布时间:2022-04-19 09:46

我来回答

1个回答

热心网友 时间:2022-04-21 06:03

每个模块相关的 css、img、js 文件都放在一起,比较直观,删除模块时也会方便许多。测试文件也同样放在一起,哪些模块有没有写测试,哪些测试应该一起随模块删除,一目了然。
build
|-- webpack.config.js # 公共配置
|-- webpack.dev.js # 开发配置
|-- webpack.release.js # 发布配置
docs # 项目文档
node_moles
src # 项目源码
|-- conf # 配置文件
|-- pages # 页面目录
| |-- page1
| | |-- index.js # 页面逻辑
| | |-- index.scss # 页面样式
| | |-- img # 页面图片
| | | |-- xx.png
| | |-- __tests__ # 测试文件
| | | |-- xx.js
| |-- app.html # 入口页
| |-- app.js # 入口JS
|-- components # 组件目录
| |-- loading
| | |-- index.js
| | |-- index.scss
| | |-- __tests__
| | | |-- xx.js
|-- js
| |-- actions
| | |-- index.js
| | |-- __tests__
| | | |-- xx.js
| |-- recers
| | |-- index.js
| | |-- __tests__
| | | |-- xx.js
| |-- xx.js
|-- css # 公共CSS目录
| |-- common.scss
|-- img # 公共图片目录
| |-- xx.png
tests # 其他测试文件
package.json
READNE.md

要完成的功能

编译 jsx、es6、scss 等资源

自动引入静态资源到相应 html 页面

实时编译和刷新浏览器

按指定模块化规范自动包装模块

自动给 css 添加浏览器内核前缀

按需打包合并 js、css

压缩 js、css、html

图片路径处理、压缩、CssSprite

对文件使用 hash 命名,做强缓存

语法检查

全局替换指定字符串

本地接口模拟服务

发布到远端机

针对以上的几点功能,接下来将一步一步的来完成这个
boilerplate 项目, 并记录下每一步的要点。

准备工作

1、根据前面的项目结构规划创建项目骨架
$ make dir webpack-react-rex-es6-boilerplate
$ cd webpack-react-rex-es6-boilerplate
$ mkdir build docs src mock tests
$ touch build/webpack.config.js build/webpack.dev.js build/webpack.release.js
// 创建 package.json
$ npm init
$ ...

2、安装最基本的几个 npm 包
$ npm i webpack webpack-dev-server --save-dev
$ npm i react react-dom react-router rex react-rex rex-thunk --save

3、编写示例代码,最终代码直接查看
boilerplate

4、根据
webpack 文档编写最基本的 webpack 配置,直接使用 NODE API 的方式
/* webpack.config.js */

var webpack = require('webpack');

// 辅助函数
var utils = require('./utils');
var fullPath = utils.fullPath;
var pickFiles = utils.pickFiles;

// 项目根路径
var ROOT_PATH = fullPath('../');
// 项目源码路径
var SRC_PATH = ROOT_PATH + '/src';
// 产出路径
var DIST_PATH = ROOT_PATH + '/dist';

// 是否是开发环境
var __DEV__ = process.env.NODE_ENV !== 'proction';

// conf
var alias = pickFiles({
id: /(conf\/[^\/]+).js$/,
pattern: SRC_PATH + '/conf/*.js'
});

// components
alias = Object.assign(alias, pickFiles({
id: /(components\/[^\/]+)/,
pattern: SRC_PATH + '/components/*/index.js'
}));

// recers
alias = Object.assign(alias, pickFiles({
id: /(recers\/[^\/]+).js/,
pattern: SRC_PATH + '/js/recers/*'
}));

// actions
alias = Object.assign(alias, pickFiles({
id: /(actions\/[^\/]+).js/,
pattern: SRC_PATH + '/js/actions/*'
}));

var config = {
context: SRC_PATH,
entry: {
app: ['./pages/app.js']
},
output: {
path: DIST_PATH,
filename: 'js/bundle.js'
},
mole: {},
resolve: {
alias: alias
},
plugins: [
new webpack.DefinePlugin({
// http://stackoverflow.com/questions/30030031/passing-environment-dependent-variables-in-webpack
"process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV || 'development')
})
]
};

mole.exports = config;
/* webpack.dev.js */

var webpack = require('webpack');
var WebpackDevServer = require('webpack-dev-server');
var config = require('./webpack.config');
var utils = require('./utils');

var PORT = 8080;
var HOST = utils.getIP();
var args = process.argv;
var hot = args.indexOf('--hot') > -1;
var deploy = args.indexOf('--deploy') > -1;

// 本地环境静态资源路径
var localPublicPath = 'http://' + HOST + ':' + PORT + '/';

config.output.publicPath = localPublicPath;
config.entry.app.unshift('webpack-dev-server/client?' + localPublicPath);

new WebpackDevServer(webpack(config), {
hot: hot,
inline: true,
compress: true,
stats: {
chunks: false,
children: false,
colors: true
},
// Set this as true if you want to access dev server from arbitrary url.
// This is handy if you are using a html5 router.
historyApiFallback: true,
}).listen(PORT, HOST, function() {
console.log(localPublicPath);
});

上面的配置写好后就可以开始构建了
$ node build/webpack.dev.js

因为项目中使用了 jsx、es6、scss,所以还要添加相应的 loader,否则会报如下类似错误:
ERROR in ./src/pages/app.js
Mole parse failed: /Users/xiaoyan/working/webpack-react-rex-es6-boilerplate/src/pages/app.js Unexpected token (18:6)
You may need an appropriate loader to handle this file type.

编译 jsx、es6、scss 等资源

使用 bael 和
babel-loader 编译 jsx、es6

安装插件:
babel-preset-es2015 用于解析 es6

安装插件:babel-preset-react 用于解析
jsx

// 首先需要安装 babel
$ npm i babel-core --save-dev
// 安装插件
$ npm i babel-preset-es2015 babel-preset-react --save-dev
// 安装 loader
$ npm i babel-loader --save-dev

在项目根目录创建 .babelrc 文件:
{
"presets": ["es2015", "react"]
}

在 webpack.config.js 里添加:
// 使用缓存
var CACHE_PATH = ROOT_PATH + '/cache';
// loaders
config.mole.loaders = [];
// 使用 babel 编译 jsx、es6
config.mole.loaders.push({
test: /\.js$/,
exclude: /node_moles/,
include: SRC_PATH,
// 这里使用 loaders ,因为后面还需要添加 loader
loaders: ['babel?cacheDirectory=' + CACHE_PATH]
});
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 如何开发由create-react-app 引导的应用 react-native image一定要设置 高宽 才能显示吗 react.js中怎么实现背景图适配手机 react import怎么使用 关于react项目中使用require导入图片不生效的问题 俄罗斯的先进战术导弹 巡航导弹巡航高度和飞行速度 闲鱼怎么找兴趣鱼塘 导弹可分为几种,用途,结构,材料? 什么叫巡航导弹 日本有类似飞鱼或者鱼叉的反舰导弹吗? 歼十有超视距导弹吗? 弹道导弹发射时要干什么,要输入哪些参数,能不能一竖起即可发射,如何缩短弹道导弹准备时间 法国飞鱼反舰导弹的导弹布局 韩国的玄武3-C技术真的超过中国了吗 射程最远的空空导弹是什么? 空空导弹问题 法国AS30L空地导弹采用了怎样的布局? 捷联惯导系统的工作原理及特点 AIM-120导弹详细资料 React 之 config-overrides文件配置 404 Not Found 404 Not Found react native android 混合开发 怎么互相调用 react native键盘遮挡视图,怎么处理 如何在react中使用fetch调用接口 React createClass 和 Component 有什么区别 react native布局方式怎么写 reactnative怎么使用百分比布局 如何在React组件中引入百度地图API web前端开发需要学习什么知识? 闲鱼的鱼塘怎么不见了 空中舞星,双龙拱门是什么 游乐设备现在有哪些? 企业庆典活动主要包括哪些类型 浙江福斯特 充气蹦床厂家及价格举例 竣工仪式的活动方案 什么叫pvc夹网充气船 珠海做会议布展,会议策划舞台背景搭建的广告公司?