在这篇文章中,我们将为您详细介绍带有节点Express的create-react-app获得%PUBLIC_URL%的内容,并且讨论关于reactref获取节点的相关问题。此外,我们还会涉及一些关于a
在这篇文章中,我们将为您详细介绍带有节点Express的create-react-app获得%PUBLIC_URL%的内容,并且讨论关于react ref获取节点的相关问题。此外,我们还会涉及一些关于app.use(express.static(__dirname + '/public')) 和 app.use(express.static('public')) 的区别;、create-react-app 如何使用 less,sass 和 react-css-modules?、create-react-app+antd+react-css-modules配置、create-react-app不支持less的解决方式的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 带有节点Express的create-react-app获得%PUBLIC_URL%(react ref获取节点)
- app.use(express.static(__dirname + '/public')) 和 app.use(express.static('public')) 的区别;
- create-react-app 如何使用 less,sass 和 react-css-modules?
- create-react-app+antd+react-css-modules配置
- create-react-app不支持less的解决方式
带有节点Express的create-react-app获得%PUBLIC_URL%(react ref获取节点)
我正在尝试使用Express服务器创建反应应用程序。设置服务器后,当我点击请求时
GET http://localhost:3333/%PUBLIC_URL%/favicon.ico 400 (Bad Request)
在错误预览中,它给了我
URIError: Failed to decode param ''/%PUBLIC_URL%/favicon.ico'' at decodeURIComponent (<anonymous>) at decode_param (/home/owaishanif/code/flashcard-app/node_modules/express/lib/router/layer.js:172:12) at Layer.match (/home/owaishanif/code/flashcard-app/node_modules/express/lib/router/layer.js:123:27) at matchLayer (/home/owaishanif/code/flashcard-app/node_modules/express/lib/router/index.js:574:18) at next (/home/owaishanif/code/flashcard-app/node_modules/express/lib/router/index.js:220:15) at jsonParser (/home/owaishanif/code/flashcard-app/node_modules/body-parser/lib/types/json.js:103:7) at Layer.handle [as handle_request] (/home/owaishanif/code/flashcard-app/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/home/owaishanif/code/flashcard-app/node_modules/express/lib/router/index.js:317:13) at /home/owaishanif/code/flashcard-app/node_modules/express/lib/router/index.js:284:7 at Function.process_params (/home/owaishanif/code/flashcard-app/node_modules/express/lib/router/index.js:335:12)
这是服务器代码
var express = require(''express'');var bodyParser = require(''body-parser'');var path = require (''path'');var data = {};express() .use(express.static(path.resolve(__dirname, ''..'', ''public''))) .use(bodyParser.json()) .get(''/api/data'', (req, res) => res.json(data)) .post(''/api/data'', (req, res) => res.json(data = req.body)) .get(''*'', (req, res) => res.sendFile( path.resolve( __dirname, ''..'', ''public/index.html''))) .listen(3333, function(){ console.log(''server running at 3333''); });
我想与服务器一起使用create react app。有在线文章,但它们已过时。欢迎使用帮助提示和技巧。
答案1
小编典典我已经解决了这个问题,使用create-react-app
build
它创建了一个构建文件夹。也%public_url%
字符串由幕后的一些纱线脚本取代。因此,我们无法直接提供该文件夹。相反,我们必须生成usingbuild
。
使用yarn build
或npm run build
。这将生成包含build文件夹asset
,manifest
和其他文件。
之后,使用该build文件夹静态提供文件以供生产使用。
app.use(express.static(__dirname + '/public')) 和 app.use(express.static('public')) 的区别;
如何解决app.use(express.static(__dirname + ''/public'')) 和 app.use(express.static(''public'')) 的区别;?
不知道下面两个是不是一样的。
(1) app.use(express.static(__dirname + "/public"));
(2) app.use(express.static("public"));
因为我认为只要 (2)
存在于 express 服务器中,浏览器就可以提供位于根路径中的 public
文件夹,而 __dirname
不是必需的。
但是,有时 (2)
不起作用而 (1)
起作用,例如我在基于 Route parameters 的动态路由中呈现 ejs 文件。
它们之间到底有什么区别?
解决方法
首先__dirname有3个用法,你可以查看documentation:
制作新目录
要在 index.js 文件中创建一个新目录,请插入 __dirname 作为 path.join() 的第一个参数,并将新目录的名称作为第二个参数插入
const fs = require(''fs'');
const path = require(''path'');
const dirPath = path.join(__dirname,''/pictures'');
fs.mkdirSync(dirPath);
指向目录
另一个独特的功能是它能够指向目录。在你的 index.js 文件中,声明一个变量并传入 __dirname 的值作为 path.join() 的第一个参数,你的包含静态文件的目录作为第二个参数
express.static(path.join(__dirname,''/public''));
将文件添加到目录
您也可以将文件添加到现有目录。在你的 index.js
文件,声明一个变量并包含 __dirname 作为第一个参数
以及您要添加为第二个的文件 如果您运行 express 应用程序
从另一个目录(不是根目录),使用绝对路径更安全
在您要提供的目录中,使用 __dirname
const fs = require(''fs'');
const path = require(''path'');
const filePath = path.join(__dirname,''/pictures'');
fs.openSync(filePath,''hello.jpeg'');
根据您的示例,我们不能使用 __dirname 但如果您从另一个目录运行 express 应用程序,则使用您想要提供服务的目录的绝对路径会更安全
app.use(express.static(__dirname + "/public"));
create-react-app 如何使用 less,sass 和 react-css-modules?
- create-react-app 如何使用 less?
- create-react-app 如何使用 sass?
- create-react-app 如何使用 react-css-modules?
Thanks @pengzeya
1.create-react-app 如何使用 less?
安装 less-watch-compiler 到开发依赖。
|
|
添加 scripts
|
|
运行命令
|
|
运行结果
创建 css 目录并生成编译后的 index.css 文件
|
|
程序运行起来后,会监控对应目录下的.less 文件,热更新到 css 目录下。
参考:https://github.com/facebook/create-react-app/issues/3457
2.create-react-app 如何使用 sass?
安装 node-sass-chokidar 到依赖
|
|
添加 scripts
|
|
运行命令
|
|
运行结果
创建 css 目录并生成编译后的 index.css 文件
|
|
程序运行起来后,会监控对应目录下的.scss 文件,热更新到 css 目录下。
参考:https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-a-css-preprocessor-sass-less-etc
3.create-react-app 如何使用 react-css-modules?
暴露出配置文件:
|
|
运行 eject 命令后,CRA 会自动把 wepack 中与 css-modules 相关的依赖为我们准备好,无需新增多余的依赖。
修改 config/webpack.config.dev.js:
|
|
修改 config/webpack.config.prod.js:
|
|
代码变化:
引入 CSS Modules 之前:
|
|
引入 CSS Modules 之后:
|
|
添加 css-modules 之前:
|
|
添加 css-modules 之后:
|
|
运行结果
|
|
注意事项:
- 将 import 进来的’./SomeComponent.css’分配给一个本地常量,例如,import foo from ‘./foo.css’;
- 在 JSX 中将 className 替换成的形式 {styles.myClass},例如,className={styles.myClass}.
- 需要修改 CSS 文件和 JSX 中的 class 名。因为 CSS Modules 不允许”-“出现在类名中,有过开发经验的朋友都知道,正则中有”word” 与”none-word” 之分,word 包括 0~9,a~z 以及下划线。而”-“不属于单词,因此 CSS Modules 不支持。例如我们需要将.Foo.bar 修改为.bar,某些方面也简化了我们的代码。使用 CSS Modules 之后,我们就不需要再使用 BEM 之类的 CSS 规范。
参考:https://medium.com/nulogy/how-to-use-css-modules-with-create-react-app-9e44bec2b5c2
create-react-app+antd+react-css-modules配置
快速开始:
npm install -g create-react-app /* 安装create-react-app */
npm install -g create-react-app /* 安装yarn */
create-react-app myapp /* 使用命令创建应用,myapp为项目名称 */
cd myapp /* 进入目录 */
yarn start /* 启动项目 */
按以上执行,即可快速创建React开发环境。
打开http://localhost:3000/ 查看
环境配置:
生成项目后,脚手架为了“优雅”... ...隐藏了所有的webpack相关的配置文件,此时查看myapp文件夹目录,会发现找不到任何webpack配置文件。执行以下命令:
yarn eject
再查看myapp 文件夹,可以看到完整的项目结构:
myapp/
node_modules/
package.json
.gitignore
config/
paths.js
polyfills
env.js
webpack.config.dev.js /* 开发环境配置文件 */
webpack.config.prod.js /* 生产环境配置文件 */
public/
index.html /* 入口html文件 */
scripts/
build.js
start.js
test.js
src/
App.js
index.js /* 主入口文件 */
antd配置
yarn add antd babel-plugin-import
按需引入
为减少打包后体积以及方便书写,可用babel-plugin-import插件,配置在config目录下,
webpack.config.dev.js 和 webpack.config.prod.js文件,这里以webpack.config.dev.js举例,
webpack.config.prod.js一样配置即可:
// Process JS with Babel.
{
test: /\.(js|jsx)$/,
include: paths.appSrc,
loader: require.resolve(''babel-loader''),
options: {
// 改动: 添加 antd 按需加载文件处理插件
plugins: [
//[''react-html-attrs''],//添加babel-plugin-react-html-attrs组件的插件配置
// 引入样式为 css
[''import'', { libraryName: ''antd'', style: ''css'' }],
// 改动: 引入样式为 less
// [''import'', { libraryName: ''antd'', style: true }],
],
// This is a feature of `babel-loader` for webpack (not Babel itself).
// It enables caching results in ./node_modules/.cache/babel-loader/
// directory for faster rebuilds.
cacheDirectory: true,
},
},
引入模块如下:
// scr/App.js
import React, { Component } from ''react'';
- import Button from ''antd/lib/button'';
+ import { Button } from ''antd'';
import ''./App.css'';
CSS Modules 配置
antd 和 css modules 不能混用,看知乎大神说 可以
针对antd的css 单独写一条loader的规则,不开启 css modules。
使用 exclude 和 include 配置
配置在config目录下,同样修改配置 webpack.config.dev.js 文件
{
test: /\.css$/,
exclude: /node_modules|antd\.css/,
use: [
require.resolve(''style-loader''),
{
loader: require.resolve(''css-loader''),
options: {
importLoaders: 1,
// 改动
modules: true, // 新增对css modules的支持
localIdentName: ''[name]__[local]__[hash:base64:5]'', //
},
},
{
loader: require.resolve(''postcss-loader''),
options: {
// Necessary for external CSS imports to work
// https://github.com/facebookincubator/create-react-app/issues/2677
ident: ''postcss'',
plugins: () => [
require(''postcss-flexbugs-fixes''),
autoprefixer({
browsers: [
''>1%'',
''last 4 versions'',
''Firefox ESR'',
''not ie < 9'', // React doesn''t support IE8 anyway
],
flexbox: ''no-2009'',
}),
],
},
},
],
},
//
{
test: /\.css$/,
include: /node_modules|antd\.css/,
use: [
require.resolve(''style-loader''),
{
loader: require.resolve(''css-loader''),
options: {
importLoaders: 1,
// 改动
// modules: true, // 新增对css modules的支持
// localIdentName: ''[name]__[local]__[hash:base64:5]'', //
},
},
{
loader: require.resolve(''postcss-loader''),
options: {
// Necessary for external CSS imports to work
// https://github.com/facebookincubator/create-react-app/issues/2677
ident: ''postcss'',
plugins: () => [
require(''postcss-flexbugs-fixes''),
autoprefixer({
browsers: [
''>1%'',
''last 4 versions'',
''Firefox ESR'',
''not ie < 9'', // React doesn''t support IE8 anyway
],
flexbox: ''no-2009'',
}),
],
},
},
],
},
下面是一个 antd 的 Button 和自己写的CSS Modules 使用小例子:
import React, { Component } from ''react'';
import { addRecipe } from ''../actions'';
import { Button } from ''antd'';
import styles from ''./App.css''
class App extends Component {
state = {
calendar: null
}
componentDidMount() {
const { store } = this.props // 从props获取store
store.subscribe(() => { // 订阅 redux store 中发生的任何变化
this.setState(() => ({ // 有任何变化需要调用 setState
calendar: store.getState() // 将从store中获取state将它放入本地组件state中
}))
})
}
submitFood = () => {
this.props.store.dispatch(addRecipe({//store.dispatch调用addRecipe动作生成器
day: ''monday'',
meal: ''breakfast'',
recipe: {
label: this.input.value
}
}))
this.input.value = ''''//将输入值重置为一个空的字符串
}
render() {
return (
<div>
<input
type=''text''
ref={(input)=>this.input = input}
placeholder="Monday''s Breakfast"
/>
<Button type="primary" onClick={this.submitFood}>Submit</Button>
<pre className={styles.input}>Monday''s Breakfast:{this.state.calendar&&this.state.calendar.monday.breakfast}</pre>
</div>
);
}
}
export default App
参考学习 CSS Modules 的阮一峰老师写的用法教程
这里简单使用下 react-css-modules,代码如下:
import React, { Component } from ''react'';
import { addRecipe } from ''../actions'';
import { Button } from ''antd'';
import CSSModules from ''react-css-modules''
import styles from ''./App.css''
class App extends Component {
state = {
calendar: null
}
componentDidMount() {
const { store } = this.props // 从props获取store
store.subscribe(() => { // 订阅 redux store 中发生的任何变化
this.setState(() => ({ // 有任何变化需要调用 setState
calendar: store.getState() // 将从store中获取state将它放入本地组件state中
}))
})
}
submitFood = () => {
this.props.store.dispatch(addRecipe({//store.dispatch调用addRecipe动作生成器
day: ''monday'',
meal: ''breakfast'',
recipe: {
label: this.input.value
}
}))
this.input.value = ''''//将输入值重置为一个空的字符串
}
render() {
return (
<div>
<input
type=''text''
ref={(input)=>this.input = input}
placeholder="Monday''s Breakfast"
/>
<Button type="primary" onClick={this.submitFood}>Submit</Button>
<pre styleName=''input''>Monday''s Breakfast:{this.state.calendar&&this.state.calendar.monday.breakfast}</pre>
</div>
);
}
}
export default CSSModules(App, styles);
主要差别在于:
+ import CSSModules from ''react-css-modules''
- <pre className={styles.input}>
+ <pre styleName=''input''>
- export default App
+ export default CSSModules(App, styles);
create-react-app不支持less的解决方式
进入node_modules\react-scripts\config目录
修改webpack.config.dev.js跟webpack.config.prod.js中关于loader的配置即可,注意loader是倒序执行的,less-loader需要先执行,所以写在规则的最后一个
webpack.config.dev.js修改后的配置如下
webpack.config.prod.js修改后的配置如下
关于带有节点Express的create-react-app获得%PUBLIC_URL%和react ref获取节点的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于app.use(express.static(__dirname + '/public')) 和 app.use(express.static('public')) 的区别;、create-react-app 如何使用 less,sass 和 react-css-modules?、create-react-app+antd+react-css-modules配置、create-react-app不支持less的解决方式的相关知识,请在本站寻找。
本文标签: