gpt4 book ai didi

javascript - 同构 reactjs cdn Assets

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:13:57 26 4
gpt4 key购买 nike

所以我几乎完成了我的第一个(同构)ReactJS,当我们部署它时,完成 build.js 有点慢。一个建议是使用 CDN 来分离 Assets 获取(cdn0、cdn1、cdn2...),我想知道如何在我的站点中做到这一点。在本地我的结构是

- build/
- config/
- webpack-development.config.js
- webpack-production.config.js
- node_modules/
- package.json
- public/
- assets/ // (this is where my assets are)
- css/
- img/
- build.js
- README.md
- src/
- views/

我的index.ejs现在是这样的

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="/" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<link rel="shortcut icon" type="image/x-icon" href="assets/img/ico-a-brain.png" />
<link rel="stylesheet" href="assets/css/normalize.css">
<link rel="stylesheet" href="assets/css/all.css">
<!-- bunch more assets here -->
</head>

<body>
<script type="text/javascript">
window.__INITIAL_STATE__ = <%- JSON.stringify(initialState) %>;
</script>

<div id="app"><%- markup %></div>
<script src="build.js"></script>
</body>
</html>

和一些有图片的组件

import React from 'react';

export default class HiwComponent extends React.Component {
render() {
return (
<main className="box-960 box-center">

<h1 className="mt-64">How It Works</h1>

<ul id="how">
<li>
<img src="assets/img/ico-how-time.svg" onError={() => { this.onerror=null; this.src='assets/img/ico-how-time.png' }} alt="Pick" />
<p><b>Pick</b> a time</p>
</li>
<li>
<img src="assets/img/ico-how-plane.svg" onError={() => { this.onerror=null; this.src='assets/img/ico-how-plane.png' }} alt="Send" />
<p><b>Send</b> request</p>
</li>
</ul>
</main>
)
}
}

如何开始更改它以使用 CDN?你们用一些包裹来处理它吗?基本上我认为它应该像本地一样它仍然会使用 ./assets/css/some.css./assets/img/some.jpg 并且在生产时它可能会查看 http://cdn0.amazon.com/assets/css/some.csshttp://cdn1.amazon.com/assets/img/some.jpg

最佳答案

更新 2:

如果您想用 cdn url 随机替换路径(根据您下面的问题),您可以轻松修改路径替换插件脚本以允许该功能。

我基于 path-replace-plugin source code 为您创建了一个简单示例

var fs = require('fs');
var fileExists = require('file-exists');
var loaderUtils = require('loader-utils');
var CDNs = [
'//cdn0.amazon.com',
'//cdn1.amazon.com',
'//cdn2.amazon.com',
];

module.exports = function(source) {
this.cacheable && this.cacheable();
var options = loaderUtils.parseQuery(this.query);

if (this.resourcePath.indexOf(options.path) > -1) {
var cdn = CDNs[Math.floor(Math.random()*CDNs.length)];
var newPath = this.resourcePath.replace(options.path, cdn + options.replacePath);
if (fileExists(newPath)) {
// Introduce file to webpack in order to make them watchable
this.dependency(newPath);
return fs.readFileSync(newPath);
}
}

return source;
};

module.exports.raw = true;

更新:

一个更简单的方法是使用 path replace plugin在网络包中。这样你就不必为你的 JS 代码添加任何复杂性

module.exports = {
module: {
loaders: [
{
test: /\.(jpe?g|png|gif|svg)$/i,
loader: 'path-replace?path=assets&replacePath=//cdn.amazon.com/assets'
}
]
}
};

希望对您有所帮助。

--

(原始答案)

如果您使用 Webpack,那么您的产品构建可以注入(inject)一个标志(变量),您可以在应用程序中使用该标志来了解您是在生产还是开发中。

即使这样:

new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
},
__DEV__: false,

现在您知道可以在自定义函数 getImageUrl() 中使用它,您可以通过 JS 模块共享它。

环境.js

function getImageUrl() {
return __DEV__ ? '/' : '//cdn.amazon.com/';
}

export const imgUrl = getImageUrl();

HiwComponent.js

import React from 'react';
import { imgUrl } from './environment';

export default class HiwComponent extends React.Component {
render() {
return (
<main className="box-960 box-center">

<h1 className="mt-64">How It Works</h1>

<ul id="how">
<li>
<img src={`${imgUrl}assets/img/ico-how-time.svg`} onError={() => { this.onerror=null; this.src=`${imgUrl}assets/img/ico-how-time.png` }} alt="Pick" />
<p><b>Pick</b> a time</p>
</li>
<li>
<img src={`${imgUrl}assets/img/ico-how-plane.svg`} onError={() => { this.onerror=null; this.src=`${imgUrl}assets/img/ico-how-plane.png` }} alt="Send" />
<p><b>Send</b> request</p>
</li>
</ul>
</main>
)
}
}

关于javascript - 同构 reactjs cdn Assets ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37295767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com