欢迎使用WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!
css实现响应式正方形或固定宽高比
代码如下
HTML:
<div class="square">
<div class="content">
Hello!
</div>
</div>
css:
.square {
position: relative;
width: 50%;
border: 4px solid red;
}
.square:after {
content: "";
display: block;
padding-bottom: 100%;
}
.content {
position: absolute;
width: 100%;
height: 100%;
}
See the Pen jxXeEB by Qing Sheng (@shengoo) on CodePen.
原理如下
在.square
中创建一个伪元素,使用padding-bottom: 100%;
,伪元素会用父级节点的宽度来计算100%,所以高度就是父级的宽度,这样就能实现正方形来。
同理,需要固定宽高比的情况下,都可以使用这种方式。
使用create-react-app生成react多页面应用
- 初始化react app
npx create-react-app multiple-page-app
- eject(eject前要commit)
yarn eject
- 在src文件夹里新建一个about.css(假如我们要做的另一个页面是about.html)
body{ background-color: yellow; }
- 在src文件夹里新建一个about.js
import React from 'react'; import ReactDOM from 'react-dom'; import './about.css'; ReactDOM.render(<div>about</div>, document.getElementById('root'));
- 增加入口配置,
config/webpack.config.dev.js
entry: { index:[ require.resolve('./polyfills'), require.resolve('react-dev-utils/webpackHotDevClient'), paths.appIndexJs ], about: [ require.resolve('./polyfills'), require.resolve('react-dev-utils/webpackHotDevClient'), paths.appSrc + "/about.js", ] },
- 修改输出配置output选项
filename: 'static/js/[name].bundle.js',
- 增加HtmlWebpackPlugin
new HtmlWebpackPlugin({ inject: true, chunks: ["index"], template: paths.appHtml, }), new HtmlWebpackPlugin({ inject: true, chunks: ["about"], template: paths.appHtml, filename: 'about.html', }),
- 效果如下
-
然后按照对dev.js的修改,同样修改好prod.js,就可以build出两个页面了。
完整代码可以在github上看到:
https://github.com/shengoo/react-demo/tree/master/multiple-page-app
在create-react-app中使用Code Splitting
在create-react-app中使用Code Splitting实现按需加载js
为了减少HTTP请求,我们会把代码打包到一个文件里。
Code splitting可以把打包的文件分割成不同的块,并实现按需加载。
下面是在create-react-app中使用方法。
简单示例
- 创建项目
npx create-react-app code-splitting
- 在src文件夹里创建文件texts.js
const hello = 'Hello World!'; export { hello };
- 修改App.js
class App extends Component { constructor(props){ super(props); this.state = {}; } componentDidMount(){ import('./texts') .then(({hello}) => { this.setState({ msg: hello, }) }) .catch(err => { }); } render() { return ( <div className="App"> <div>{this.state.msg || 'loading...'}</div> </div> ); } } export default App;
- Chrome中network
分割react的组件
使用React Loadable分割,React Loadable还能创建 loading states, error states, timeouts, preloading,等状态。
原来的引用方式:
import OtherComponent from './OtherComponent';
const MyComponent = () => (
<OtherComponent/>
);
使用React Loadable启用了Code splitting的方式:
import Loadable from 'react-loadable';
const LoadableOtherComponent = Loadable({
loader: () => import('./OtherComponent'),
loading: () => <div>Loading...</div>,
});
const MyComponent = () => (
<LoadableOtherComponent/>
);
例子:
- 添加依赖
yarn add react-loadable
-
新建一个组件
Hello.js
import React from 'react'; export default () => ( <div>Hello world.</div> )
- 在App.js中引用Hello
import Loadable from 'react-loadable'; const LoadableOtherComponent = Loadable({ loader: () => import('./Hello'), loading: () => <div>Loading...</div>, }); const Hello = () => ( <LoadableOtherComponent/> );
- 在render函数里渲染
-
从network里可以看到又多了一个js文件
根据路由分割
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Loadable from 'react-loadable';
const Loading = () => <div>Loading...</div>;
const Home = Loadable({
loader: () => import('./routes/Home'),
loading: Loading,
});
const About = Loadable({
loader: () => import('./routes/About'),
loading: Loading,
});
const App = () => (
<Router>
<Switch>
<Route exact path="/" component={Home}/>
<Route path="/about" component={About}/>
</Switch>
</Router>
);
-
安装依赖
yarn add react-router-dom
-
创建路由页面
routes/Home.js
import React from 'react'; export default () => ( <div>Home</div> )
routes/About.js
import React from 'react'; export default () => ( <div>About</div> )
- 在App.js中引用路由页面
const Loading = () => <div>Loading...</div>; const Home = Loadable({ loader: () => import('./routes/Home'), loading: Loading, }); const About = Loadable({ loader: () => import('./routes/About'), loading: Loading, });
- 配置路由
import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom'; ... render() { return ( <Router> <div> <div>{this.state.msg || 'hello'}</div> <Hello/> <div> <Link to={'/'}>home</Link> <Link to={'/about'}>about</Link> </div> <Switch> <Route exact path="/" component={Home}/> <Route path="/about" component={About}/> </Switch> </div> </Router> ); }
- 在Chrome中查看network,可以看到第一次点击about的时候,浏览器会异步加载about组件的js
完整代码可以在github上看到:
https://github.com/shengoo/react-demo/tree/master/code-splitting
http304是怎么产生的。(选自《图解HTTP》-上野宣)
该状态码表示客户端发送附带条件的请求(附带条件的请求是指采用GET方法的请求报文中包含If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since中任一首部。)时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304 Not Modified(服务器端资源未改变,可直接使用客户端未过期的缓存)。304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系。
附带条件请求
形如If-xxx这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
If-Modified-Since
是这样产生304的
If-Match和ETag
上图中显示的200是不是应该是304啊?
使用react-native实现material design中的滑动头部效果
react-native中使用SafeAreaView保证iPhoneX兼容性
react-native从0.50.1开始,提供了SafeAreaView来确保iPhone X的兼容性,效果如下:
代码如下:
import {
...
SafeAreaView
} from 'react-native';
class Main extends React.Component {
render() {
return (
<SafeAreaView style={styles.safeArea}>
<App />
</SafeAreaView>
)
}
}
const styles = StyleSheet.create({
...,
safeArea: {
flex: 1,
backgroundColor: '#ddd'
}
})
并且,SafeAreaView会在接打电话等需要调整状态栏高度的时候自动调整状态栏的高度:
jQuery()函数的4中调用方式
jQuery()函数的4中调用方式
选择元素
$(selector)
$(selector,context)
封装成jQuery对象
$(Element|Document|Window)
创建jQuery对象
$('<img/>')
$('<img/>',{
src: url
})
传入函数,在文档加载完毕运行
DOMContentLoaded
jQuery(function(){});
$(document).ready(function(){});
使用ES6的Proxy实现简单的双向绑定
ES6的Proxy对象可以用来拦截一个Object对象的属性的修改,这次我们利用它来实现一个简单的双向绑定。
废话不多说,请看代码。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>View to model</title>
</head>
<body>
<div>
<!-- 使用'bind-to'的属性来标记这个输入框里的值会对Model里的属性进行修改 -->
<input bind-to="name" />
<input bind-to="name" />
</div>
<!-- 使用#属性名#来把Model里的值映射到DOM中 -->
<span>#name#</span>
<span>#name#</span>
<button onclick="reset()">reset</button>
<script type="text/javascript">
var handler = {
// 拦截属性的设置,触发试图的更新
set: function(target, key, value, receiver) {
target[key] = value;
updateView(propertyName);
return Reflect.set(target, key, value);
},
};
// 双向绑定的对象
var model = new Proxy({}, handler);
// 双向绑定列表
var inputs = {},views = {};
var all = document.all;
// 遍历所有DOM元素
for(var i=0,l=all.length;i<l;i++){
// 找到所有有bind-to的输入框
if(all[i].getAttribute('bind-to')){
var dom = all[i];
var propertyName = dom.getAttribute('bind-to');
inputs[propertyName] = inputs[propertyName] ? inputs[propertyName] : [];
views[propertyName] = views[propertyName] ? views[propertyName] : [];
inputs[propertyName].push(dom);
dom.addEventListener('change',function function_name(e) {
var propertyName = e.target.getAttribute('bind-to');
model[propertyName] = e.target.value;
})
}
// 找到所有model驱动的页面元素
if(all[i].innerHTML && all[i].innerHTML.length>2 &&
all[i].innerHTML[0] == '#' &&
all[i].innerHTML[all[i].innerHTML.length-1] == '#'){
var propertyName = all[i].innerHTML.slice(1,all[i].innerHTML.length-1);
inputs[propertyName] = inputs[propertyName] ? inputs[propertyName] : [];
views[propertyName] = views[propertyName] ? views[propertyName] : [];
views[propertyName].push(all[i]);
}
}
// 更新View
function updateView(propertyName) {console.log('update ' + propertyName);
if(views[propertyName]){
for(var i = 0,l = views[propertyName].length;i < l;i++){
views[propertyName][i].innerText = model[propertyName];
}
}
if(inputs[propertyName]){
for(var i = 0,l = inputs[propertyName].length;i < l;i++){
inputs[propertyName][i].value = model[propertyName];
}
}
}
function reset() {
for(var name in model){
model[name] = '';
}
}
</script>
</body>
</html>
使用阿里云的免费CA证书服务为自己的网站开通https
购买证书
- 首先登录阿里云的控制台,选择“安全(云盾)”目录下的CA证书服务
-
点击右上角的“购买证书”按钮
-
找到免费的证书,阿里云的免费证书藏的比较深
- 在保护类型里选择“一个域名”
-
选择品牌“Symantec”
-
证书类型里才会出现免费的,选择“免费型DV SSL”
-
购买并支付
生成并下载证书
-
打开证书管理页面
-
在证书列表里点击“补全”
-
填写域名信息
-
填写个人信息
-
提交
-
审核完成之后就可以在证书管理页面下载证书了
-
点击下载之后会打开下载证书的页面,选择对应的服务器的证书下载即可
安装证书(nginx)
-
在Nginx的安装目录下创建cert目录,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为214499409770626.key;
-
在
/etc/nginx/sites-available
里创建一个新的网站配置文件(以下属性中ssl开头的属性与证书配置有直接关系,其它属性请结合自己的实际情况复制或调整)server { listen 443; server_name [你的域名]; ssl on; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; ssl_certificate cert/[你的证书名字].pem; ssl_certificate_key cert/[你的证书名字].key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }
-
创建一个连接,把你刚才编辑的文件连接到
/etc/nginx/sites-enabled
目录下 -
重启 Nginx
-
通过 https 方式访问您的站点,测试站点证书的安装配置。