React 初探
React 初探
同时发表于 AlloyTeam
React 简单介绍
先说 React 与 React Native
他们是真的亲戚,可不像 Java 和 Javascript 一样。
其实第一次看到 React 的语法我是拒绝的,因为这么丑的写法,你不能让我写我就写。
但当我发现 React Native 横空出世后,它学习一次到处运行的理念非常诱人。React Native 可以写出原生体验的 iOS/Android 应用?那不就多了一门装逼技能?所以我们调研小组试了一下,感觉 "Duang" 一下,很爽很舒服。写 React Native 需要两门基础技能:React 语法 和 iOS 基础知识。
很爽很舒服,索性就研究一下,算是入门。 了解之后发现,React 真是有另一番天地,值得学习。
接下来总结以下我对 React 的理解,分享给大家。
至于 React Native,有机会再好好探究下。
这部分废话太多,喜欢实战的可以直接看代码部分。
React 是 Facebook 出品的一套颠覆式的前端开发类库。
为什么说它是颠覆式的呢?
内存维护虚拟 DOM
对于传统的 DOM 维护,我们的步骤可能是:
初始化 DOM 结构
从服务器获取新数据
使用新数据更新局部 DOM
绑定各种事件
首先,我们操作 DOM 是最昂贵的开销,对于 需要反复更新 DOM 的网页,无疑是噩梦。其次,对 DOM 局部的更新以及事件绑定加大了维护的难度。
而 React 引入了一个全新的概念:虚拟 DOM。
虚拟 DOM 是躺在内存里的一种特殊的结构,我们可以理解为这是真实 DOM 在内存里的映射。
除了结构上的映射外,这个虚拟的 DOM 还包括了渲染 真实所需要的数据以及事件绑定。
全量更新真实 DOM
虚拟 DOM 在创建时,首先是使用 JSX 的语法生成一个真实 DOM 树的映射,其次是从服务器端拉取远程数据,接着注入到这个虚拟 DOM 树中,同时绑定事件。
好了,有了虚拟 DOM、数据、事件,万事俱备。
接下来,调用 render() 方法一次性渲染出真实的 DOM,然后全量插入到网页中。
虚拟 DOM 静静地躺在内存里,等待数据更新。
新数据来临,调用 setState() 方法更新数据到虚拟 DOM 中,然后自动调用 render() 再一次性渲染出真实的 DOM ,然后全量更新到网页中。
一个虚拟 DOM,对应一个真实 DOM
一份数据更新,重新生成虚拟 DOM ,全量更新真实 DOM
就这么简单。 除了带来性能上的提升之外,很显然这种写法简化了我们维护 DOM 的成本 -- 我们只需要维护一份数据。
只是 View,可配合其他类库使用
可以看到,React 里最重要的概念有虚拟 DOM、单向数据注入(虚拟 DOM 到真实 DOM)。 这里并没有引入太多其他的东西,所以我对 React 的理解是一个类库,而非框架。 如果要使用 MVC、MVVM 等技术的吧,完全可以把 React 当做其中的 V,即 View, 配合其他类库使用。
组件化
我虽然是个前端菜鸟,但日观天象也是能嗅到下一代 Web 将是组件化、组件复用共享的时代。
React 编写起来,就是编写一个个的组件。
我对一个 React 组件的理解是:
模板 HTML (JSX 语法格式)
样式 CSS (还是独立的样式文件)
交互 JS (与HTML一起,揉和到 JSX 语法中)
以上三者可以打包复用,甚至是无缝接入,我脚得它就可能是未来了。
HTML 与 JS 使用 JSX 语法糅合到一起的方式是见仁见智,恐怕会引起战争。
我刚接触到 JSX 的时候,一开口也是『我*,好丑』。
但慢慢地却发现,这种方式一开始写起来别扭,但用得却很爽。
接下来,我通过编写一个简单的应用来入门 React。
看完如果大呼不过瘾,建议直飞 React 官方看文档,那才是宝藏!
React 简单示例
示例代码放置在 demo/ 目录下,每个文件夹为一个独立的示例。
先看下这个 demo 最终的样子吧:
demo - 速度与激情
每个示例的入口文件 index.html 结构大体相同:
渲染一个虚拟 DOM 为真实 DOM
使用 render() 方法生成真实 DOM 并插入到网页中。
// 使用 React.createClass 创建一个组件
var DemoComponent = React.createClass({
// 使用 render 方法自动渲染 DOM
render: function () {
return (
)
}
});
// 将组件插入到网页中指定的位置
React.render( , document.getElementById('demo'));
在线演示 demo/render
示例代码 demo/render
设置初始数据
第一次渲染真实 DOM 时将使用 getInitialState() 返回的数据。
// 使用 React.createClass 创建一个组件
var DemoComponent = React.createClass({
// getInitialState 中返回的值将会作为数据的默认值
getInitialState: function () {
return {
title: '我喜欢的电影',
movies: [
{
id: 7,
name: '速度与激情7',
date: 2015
},
{
id: 6,
name: '速度与激情6',
date: 2013
}
]
}
},
// 使用 render 方法自动渲染 DOM
render: function () {
// this.state 用于存储数据
var title = this.state.title;
var movies = this.state.movies.map(function (movie) {
return (
{movie.name}
-
{movie.date}
)
});
return (
)
}
});
// 将组件插入到网页中指定的位置
React.render( , document.getElementById('demo'));
在线演示 demo/get-initial-state
示例代码 demo/get-initial-state
动态更新数据
第二次更新渲染真实 DOM 时将使用 setState() 设置的数据。
// 使用 componentDidMount 在组件初始化后执行一些操作
componentDidMount: function () {
// 拉取远程数据
// 开启假数据服务器:
// cd fake-server && npm install && node index.js
this.fetchData();
},
// 使用自定义的 fetchData 方法从远程服务器获取数据
fetchData: function () {
var self = this;
// 发起 ajax 获取到数据后调用 setState 方法更新组件的数据
var url = '../../fake-data/movies.json';
$.getJSON(url, function (movies) {
// 本地模拟返回太快了,模拟一下网络延迟
setTimeout(function() {
self.setState({
movies: movies
});
}, 2000);
});
},
在线演示 demo/set-state
示例代码 demo/set-state
绑定事件
绑定事件时,我们可以使用 ref="name" 属性对一个 DOM 节点进行标记,同时可以通过 React.findDOMNode(this.refs.name) 获取到这个节点的原生 DOM。
// 使用 render 方法自动渲染 DOM
render: function () {
var self = this;
// this.state 用于存储数据
var title = this.state.title;
var movies = this.state.movies.map(function (movie) {
return (
{movie.name}
-
{movie.date}
删除
)
}.bind(this));// 注意这里 bind(this) 修正了上下文
return (
Hello React
React 初探
{title}
{this.state.loading ?
大家好我是菊花, 我现在在转
: null}
)
}
onRemove: function (movie) {
var id = movie.id;
console.log(movie)
// 删除这个 item
var movies = this.state.movies;
var len = movies.length;
var index = -1;
for(var i = 0; i < len; i++) {
var _movie = movies[i];
if (_movie.id === id) {
index = i;
break;
}
}
if (index > 0) {
movies.splice(index, 1);
this.setState({
movies: movies
});
}
},
onAdd: function (e) {
e.preventDefault();
var refs = this.refs;
var refName = React.findDOMNode(refs.name);
var refDate = React.findDOMNode(refs.date);
if (refName.value === '') {
alert('请输入电影名');
return;
} else if (refDate === '') {
alert('请输入上映时间');
return;
}
var movie = {
// 使用 findDOMNode 获取到原生的 DOM 对象
name: refName.value,
date: refDate.value,
id: Date.now() // 粗暴地以时间数字作为随机 id
};
var movies = this.state.movies;
movies.push(movie);
this.setState(movies);
refName.value = '';
refDate.value = '';
},
在线演示 demo/events
示例代码 demo/events
多组件与组件嵌套
一个组件就包含了 JSX 模板、数据维护、事件绑定的话,代码量已经够多了,这时候可以采用 AMD/CMD 的方式,将组件进行更细粒度的划分,可以以文件即组件的方式来编写,这里就不上 demo 了。
组件间通信
在 React 中,数据流是单向的,且组件之间可以嵌套,我们可以通过对最顶层组件传递属性方式,向下层组件传送数据。
全局数据存储怎么做呢?可以理解为不同的组件获取的数据源一致,在组件的外部维护这个数据集合,或者干脆直接从服务器端获取。
有人会说了,这样很不方便。
但我觉得,既然是一个组件,那就配套有获取组件所需数据的方式,独立组件间有很强的数据依赖时,要么使用上述方式,要么可以简单粗暴,将独立组件用一个顶层组件包裹起来,转化为嵌套组件的关系,即可数据互通。
// 将子组件抽离出来
var LiWrapper = React.createClass({
render: function () {
// 使用 this.props 获得传入组件的数据
var movie = this.props.movie;
return (
{/* ... */}
)
}
});
// 使用 React.createClass 创建一个组件
var DemoComponent = React.createClass({
// 使用 getInitialState 的返回值作为数据的默认值
getInitialState: function () {
// ...
},
// 使用 render 方法自动渲染 DOM
render: function () {
// this.state 用于存储数据
var movies = this.state.movies.map(function (movie) {
return (
)
}.bind(this));// 注意这里 bind(this) 修正了上下文
return (
)
}
});
// 将组件插入到网页中指定的位置
// 在使用组件时传入 movies 数据
var movies = [// ...];
React.render(, document.getElementById('demo'));
在线演示 demo/comunications
示例代码 demo/comunications
打造丝滑的构建 使用 ES6 + gulp + webpack
ES6 和 gulp 的话就不多介绍啦。
webpack 是一款新生的前端构建工具,兼容 AMD/CMD 等写法,支持 Browser 和 Node 端共享代码,在浏览器端可以像写 Node 一样方便的进行模块化的划分。
在这里主要用 webpack 的两个插件:
来看下简单目录结构:
js/main.js 为入口文件,引入了两个组件。
var React = require('react');
var MovieListComponent = require('./components/movie-list');
var HelloMessageComponent = require('./components/hello');
var movies = [
{
id: 5,
name: '速度与激情5',
date: 2011
},
{
id: 4,
name: '速度与激情4',
date: 2009
}
];
var wording = '保罗';
var MainComponent = React.createClass({
render: function () {
return (
)
}
});
React.render( , document.getElementById('demo'));
js/components/movie-list.js 组件为 JSX 语法编写
var React = require('react');
// 引入子组件
var MovieComponent = require('./movie');
// 使用 React.createClass 创建一个组件
var MovieListComponent = React.createClass({
// 使用 getInitialState 的返回值作为数据的默认值
getInitialState: function () {
return {
loading: true,
title: '我喜欢的电影',
// 注意这里将 外部传入的数据赋值给了 this.state
movies: []
}
},
// 使用 render 方法自动渲染 DOM
render: function () {
// this.state 用于存储数据
var title = this.state.title;
// this.props 用于从组件外部传入数据
var movies = this.props.movies;
movies = movies.map(function (movie) {
return (
)
}.bind(this));// 注意这里 bind(this) 修正了上下文
return (
)
}
});
module.exports = MovieListComponent;
js/components/hello.js 组件为 ES6 + JSX 语法编写
var React = require('react');
class HelloComponent extends React.Component {
constructor(props) {
super(props);
this.state = {wording: '你好呀, '};
}
render() {
return
{this.state.wording} {this.props.name}
;
}
}
module.exports = HelloComponent;
webpack.config.js 指定 jsx-loader 和 es6-loader
module.exports = {
entry: ['./js/main.js'],
output: {
path: __dirname,
filename: 'js/bundle.js'
},
module: {
loaders: [
{ test: /\.js$/, loader: 'es6-loader' },
{ test: /\.js$/, loader: 'jsx-loader' }
]
}
};
gulpfile.js 在这里配置 webpack 任务,启动文件监听
var gulp = require('gulp');
var livereload = require('gulp-livereload');
var webpack = require("gulp-webpack");
var webpackConfig = require('./webpack.config');
gulp.task("webpack", function() {
return gulp.src('./js/main.js')
.pipe(webpack(webpackConfig))
.pipe(gulp.dest('.'));
});
gulp.task('watch', function() {
livereload.listen();
gulp.watch(['js/**/*.js', '!js/bundle.js'], ['webpack']);
});
gulp.task('default', [
'webpack',
'watch'
]);
index.html 示例页面,引入 webpack 打包后的 js/bundle.js
在 js/main.js 中引入两个不同的组件,然后在 webpack.config.js 中指定编译 JSX 和 ES6 的 loader 工具,使用 gulp 监听 js/ 中文件变化,自动编译出的 js/bundle.js 将被 index.html 引用。
嗯,再在 webpack 中加入各种你喜欢的 loader,在 gulp 中加上各种 css、js、img 的处理任务,编写代码,自动重新编译,纵享丝滑。
示例代码
零碎总结
文章到这里应该就算结束了,接下来是一些在学习过程中记下来的几个小点,也分享给大家。
简单理解 JSX 语法
JSX 把 JS 和 HTML 糅合起来了,这么理解是不是感觉比较简单:
遇到 {} 包裹的是 JS,遇到 <> 包裹的是 HTML
render() 中 返回的的 JSX 模板需要一个根元素包裹起来
比如:
// 错误的写法
var MyComponent = React.createClass({
render: function () {
return (
速度与激情7
致敬保罗
)
}
});
应该写成:
// 正确的写法
var MyComponent = React.createClass({
render: function () {
return (
)
}
});
几个重要方法
render()
返回的是一系列嵌套的组件
this.props
获取父组件传递给子组件的数据
this.setState({data: data});
用于动态更新状态,设置数据(设置后UI会自动刷新)
getInitialState()
在整个组件的生命周期中只会执行一次,用于初始化数据
componentDidMount
会在 render 后自动调用,用于异步获取数据,更新数据
操作数据的流程
gitInitialState()
初始化数据
render()
渲染初始化数据
componentDidMount()
异步获取数据
setState()
更新数据
理解一个组件的状态转换
每一个组件都可以理解为有一个简单的状态机。
调用 setState(data, callback) 后,data 将会混入 this.state 中,数据得到了更新,render() 就会被调用,UI 就能被更新。
组件之间如何通信
父组件可以获取到子组件:this.props.children
render() 永远不要手动调用
render() 在 React 创建时会调用一次,在数据更新时调用 setState() 方法则会继续调用它来更新网页中的真实 DOM。
使用 getInitial() 设置默认值
这个方法返回的值会在组件初始化第一次调用 render() 时就被使用
class 是关键字,改用 className
// 错误的写法
var MyComponent = React.createClass({
render: function () {
return (
)
}
});
应该写成:
// 正确的写法
var MyComponent = React.createClass({
render: function () {
return (
)
}
});
组件名大写,不然不被识别
// 错误的写法
var myComponent = React.createClass({
render: function () {
return (
)
}
});
React.render( , document.getElementById('demo'));
应该写成:
// 正确的写法
var MyComponent = React.createClass({
render: function () {
return (
)
}
});
React.render( , document.getElementById('demo'));
怎么隐藏或显示菊花
var MyComponent = React.createClass({
getInitialState: function () {
return {
loading: true
}
},
showLoading: function () {
this.setState({loading: true})
},
hideLoading: function () {
this.setState({loading: false})
},
render: function () {
return (
{
this.state.loading ?
大家好我是菊花,我在转
:
null
}
)
}
});
插入原生的 HTML 片段的方式
React 会为我们过滤 XSS,要让一段 HTML 片段直接显示出来,需要这样:
让 React 支持移动触摸实践
React.initializeTouchEvents(true);
处理表单
表单因为会因用户交互而变化,所以有特定的一些属性
input 和 textarea 组件具有 value
input[type=checkbox]
和 input[type=radio]
具有 checked
option 具有 selected,如果要支持多选,可以传入数组:
表单项具有 onChange 事件
注意如果这么写:
render: function() {
return ;
}
那每次 render 的时候 input 的 value 都会被重置为 "Hello!",所以需要这么控制:
getInitialState: function() {
return {value: 'Hello!'};
},
handleChange: function(event) {
this.setState({value: event.target.value});
},
render: function() {
var value = this.state.value;
return ;
}
利用这点,可以无缝地接入一些验证规则,比如限制文字为 140 字:
handleChange: function(event) {
this.setState({value: event.target.value.substr(0, 140)});
}
如果不想这么被控制呢?那就在返回 input 的时候,不要设置 value 属性,这样随着用户输入,value 不会被重置:
render: function() {
return ;
}
也可以设置默认值:
render: function() {
return ;
}
除了 defaultValue
之外,还支持 defaultChecked
理解虚拟 DOM
React 会在内存里维护一个代表 DOM 的结构,调用 render 方法时才生成真正的 DOM 插入到网页中。
理解组件的生命周期
一个组件的声明周期可以理解为三个阶段:
mounting 组件正在插入到 DOM 中
updating 组件正在重新注入新数据后更新到 DOM 中
unmounting 组件从 DOM 中移除
mounting 阶段
getInitialState()
被调用,返回原始数据
componentWillMount()
在组件 mounting 前调用
componentDidMount()
在组件 mounting 完成后调用
updating 阶段
componentWillReceiveProps(nextProps)
在接收到新的 props 时调用
shouldComponentUpdate(nextProps, nextState)
在组件需要更新 DOM 时调用,若这个函数返回 false 则告诉 React 不要更新
componentWillUpdate(nextProps, nextState)
在更新发生时调用,可以在这里调用 this.steState() 刷新数据
componentDidUpdate(prevProps, prevState)
在更新完成后调用
unmounting 阶段
componentWillUnmount() 在组件移除时被调用,在这里可以对数据进行清理
强制使用数据更新组件
forceUpdate() 强制使用数据更新组件,而不用调用 this.setState()
获取原生 DOM 元素
React.findDOMNode(component)
返回原生的 DOM 元素 注意要获取原生的 DOM 元素,必须在 render 被调用, 真正的 DOM 已经被插入到页面中时。
理解 refs
可以把 refs 理解为我们在 HTML 中的id,用于定位到指定的组件。
ref 属性可以是一个回调函数而不是名字,这个回调会在组件 mounted 后被调用。回调函数使用被引用的组件作为参数。
注意不要在 render 方法中访问 refs 属性。
你可能感兴趣的:(react.js,webpack,gulp,es6)
webpack图片等资源的处理
dmengmeng
需要的loaderfile-loader(让我们可以引入这些资源文件)url-loader(其实是file-loader的二次封装)img-loader(处理图片所需要的)在没有使用任何处理图片的loader之前,比如说css中用到了背景图片,那么最后打包会报错的,因为他没办法处理图片。其实你只想能够使用图片的话。只加一个file-loader就可以,打开网页能准确看到图片。{test:/\.(p
详解“c:/work/src/components/a/b.vue“‘ has no default export报错原因
hw_happy
开发语言 前端 vue.js javascript
前情提要在一个vue文件中需要引入定义的b.vue文件,但是提示b文件没有默认导出,对于vue2文件来说有exportdefault,在中,所有定义的变量、函数和组件都会自动被视为默认导出的组件内容。因此,不需要显式地使用exportdefault来导出组件。但是在我引用这个文件的时候还是提示了这个错误,原来是我的项目使用了ts和vite\webpack,因为TypeScript和Vue的默认导出
EcmaScript和JavaScript的区别
每天吃八顿
前端 ecmascript
ECMAScript和JavaScript是经常被混淆的两个术语,但实际上它们之间存在一些区别:ECMAScript:ECMAScript(通常缩写为ES,并且有版本号如ES5,ES6和ES7等)是由ECMA国际(EuropeanComputerManufacturersAssociation)制定的一种脚本语言的规范。这个规范定义了语法、命令、数据类型等基本元素。ECMAScript是一种规范,
react里的index.js是怎么跟index.html结合起来的?
SherrinfordL
image.pngcreate-react-app把webpack、babel等配置都封装到了依赖项目react-script中,所以你无法直观的看到这些配置。你可以在项目下运行npmruneject,被隐藏的配置文件就会暴露到项目根路径下。把请求转发到index.html原因是,你执行npmrunstart时,启动的webpack-dev-server,会加载react-script项目conf
1.forEach
Night_LION
varcolors=["red","blue","green"];//ES5遍历数组方法for(vari=0;i//console.log(colors[i]);}//ES6forEachcolors.forEach(function(color){//console.log(color);});//练习:遍历数组中的值,并计算总和varnumbers=[1,2,3,4,5];varsum=0;f
深入理解Webpack核心模块Tapable钩子[异步版]
weixin_34413802
webpack javascript ViewUI
接上一篇文章深入理解Webpack核心模块WTApable钩子(同步版)tapable中三个注册方法1tap(同步)2tapAsync(cb)3tapPromise(注册的是Promise)tapable中对三个触发方法1call2callAsync3promise这一章节我们将分别实现异步的Async版本和Promise版本异步钩子AsyncParallelHookAsyncParallelHo
webpack 之 tapable 学习
weixin_34008784
webpack javascript ViewUI
前言webpack大家应该都耳熟能详了。个人感觉,webpack的本质就是让一堆的Loader和Plugin在webpack的可支配范围内,有序可控的执行,最终生成一堆可在浏览器中执行的code和一些状态信息。而这些Loader和Plugin,有用户自定义的,也有webpack自己内部定义的。Loader的运行机制,不是这篇文章讲述的内容,有需要的朋友,可以看下我之前的这篇文章:webpack之l
webapck由浅入深——(Tapable)
weixin_33737134
webpack ViewUI
webpack系列文章webpack由浅入深——(webpack基础配置)webpack由浅入深——(webpack优化配置)webpack由浅入深——(tapable)webpack由浅入深——(webapck简易版)webpack由浅入深——(ast、loader和plugin)Tapable和webpackTapable是基于发布订阅模式实现的一个类库,提供了许多Hook类,可创建许多钩子。
webpack插件开发必会Tapable
web老猴子
webpack 前端 javascript
认识Tapable官方对tapable的定义是钩子,业界很多写tapable的觉得它是发布订阅模式,它确实很像发布订阅模式,但是不完全是,至于官方说的钩子,个人感觉在webpack内部可以称作钩子,因为是官方定义的,所以肯定是按照设计的想法来使用的,如果是你自己使用,操作不当可能就不是钩子了,毕竟只是一个工具,你拿扳手当锤子也没人说你什么,以上是个人见解,下面附上一些验证的思路。不喜欢论证,喜欢看
webpack的插件机制(Tapable)
若梦plus
前端工程化 webpack 前端
webpack的插件机制(Tapable)在具体介绍webpack内置插件与钩子可视化工具之前,我们先来了解一下webpack中的插件机制。webpack实现插件机制的大体方式是:创建-webpack在其内部对象上创建各种钩子;注册-插件将自己的方法注册到对应钩子上,交给webpack;调用-webpack编译过程中,会适时地触发相应钩子,因此也就触发了插件的方法。Webpack本质上是一种事件流
四、webpack4.0 - tapable
Razas
WEBPACK4 webpack4.0
一、tapable介绍webpack中插件的时候,需要用到tapable。新建一个项目WEBPACK-Tapable。初始化package.json:npminit-y安装:npminstalltapable--savetapable是一个包。二、tapable三、AsyncParralleHook四、AsyncSeriesHook五、AsyncSeriesWaterfall
tapable详解
风火一回
webpack tapable webpack 插件制作
tapable详解tapable是webpack内部使用的一个流程管理工具,主要用来串联插件,完善事件流执行。1.安装tapableyarnaddtapable2.常用hooksimport{SyncHook,SyncBailHook,SyncWaterfallHook,SyncLoopHook,AsyncParallelHook,AsyncParallelBailHook,AsyncSeries
Tapable
信海利世
webpack webpack 前端
一、Tapable是什么?Tapable是一个类似于Node.js的EventEmitter的库,主要是控制钩子函数的发布与订阅,控制着webpack的插件系统。Tapable库暴露了很多Hook(钩子)类,为插件提供挂载的钩子const{SyncHook,//同步钩子SyncBailHook,//同步熔断钩子即return一个非undefined的值,则不再继续执行后面的监听函数SyncWate
Webpack插件核心原理
gogo2027
webpack
引言围绕Webpack打包流程中最核心的机制就是所谓的Plugin机制。所谓插件即是webpack生态中最关键的部分,它为社区用户提供了一种强有力的方式来直接触及webpack的编译过程(compilationprocess)。今天,我们来聊聊Webpack中必不可少的核心Plugin机制~Plugin本质上在Webpack编译阶段会为各个编译对象初始化不同的Hook,开发者可以在自己编写的Plu
webpack怎么配置单页面或者多页面项目?
镜中的女孩-potato
webpack 前端 node.js
单页直接在entry中指定单页面的入口文件即可,对于多页面来说,如果页面之间有依赖关系可以考虑将entry的值改成一个数组,数组中的每一项是入口文件的地址,并且通过dependOn配置多个入口的依赖关系,一般的,我们也可以直接在entry中配置多个入口文件的键值对1、单页面举个例子=>你有这样一个项目架构├──config│├──webpack.config.js//webpack配置文件├──s
fetch-event-source 如何通过script全局引入
cuiyuchen111
javascript 前端
fetchEventSource源码中导出了两种类型的包cjs和esm。但是有个需求如何在原生是js中通过script标签引呢?需要加上type=module。今天介绍另一种方法下载源码文件:https://github.com/Azure/fetch-event-source.git安装:npminstall--save-devwebpackwebpack-clits-loadertypescr
【Webpack 踩坑】CSS加载缓慢
①条咸鱼
webpack css rust
问题:使用webpack5,单独index.scss在assets/css目录下,但是不管是production还是development环境下,都会出现dom加载完后再渲染样式本意是想要将样式单独打包到一个文件夹,还有压缩css于是用了mini-css-extract-plugin这个loader(前提要先安装)//webpack.config.jsconstMiniCssExtractPlug
从零开始一步一步搭建 Vue3 + Webpack5 项目脚手架指南
Sam9029
Webpack 前端 webpack
**若此文你认为写的不错,不要吝啬你的赞扬,求收藏,求评论,求一个大大的赞!**由于文章有一万字左右的,故而内容中部分不免冗余,或许有写了些废话进去,但整体也无伤大雅**文章是初次实践总结,若有错误或某个内容有更优的解决方案,还望指正!**附录中有脚手架文件夹目录大纲(Vue3+Webpack5)脚手架项目源码:https://github.com/sam9029/s9_webpack_g
webpack原理、优势、基本功能和常见问题
伟大的人民艺术家
javascript es6
webpack是一个模块打包工具,用它可以管理项目中的模块依赖,并编译出所需的静态文件。打包原理:webpack打包原理是根据文件间的依赖关系对其进行静态分析,将这些模块按指定规则生成静态资源,当webpack处理程序时,它会递归地构建一个依赖关系图,其中包含应用程序需要的每个模块,将所有这些模块打包成一个或多个bundle。webpack构建流程初始化参数—>开始编译---->确定入口---->
前端技能树,面试复习第 29 天—— 简述 Babel 的原理 | Webpack 构建流程 | Webpack 热更新原理 | Git 常用命令
编程轨迹_
前端面试复习笔记 前端面试面经 前端工程化 Webpack Babel 前端面试 大厂面试题
31b3479814f74acbb70b9f63f2e80012.gif"width=“100%”>⭐️本文首发自前端修罗场(点击加入社区,参与学习打卡,获取奖励),是一个由资深开发者独立运行的专业技术社区,我专注Web技术、答疑解惑、面试辅导以及职业发展。。1.Babel的原理是什么?babel的转译过程也分为三个阶段,这三步具体是:解析、转换、生成解析Parse:将代码解析⽣成抽象语法树(AS
前端开发深入了解webpack
史努比的大头
前端
什么是webpackWebpack是一个现代JavaScript应用程序的模块打包工具。它主要用于将各种资源(如JavaScript、CSS、图片等)打包成一个或多个文件,以优化Web应用的加载性能。Webpack的核心功能包括:模块化:支持将代码拆分为模块,便于管理和重用。打包:将多个模块和资源打包成一个或多个文件,减少HTTP请求。加载器(Loaders):处理不同类型的文件(如转换ES6到E
【Webpack】了解Webpack
Sam9029
Webpack webpack 前端 node.js
Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-前端领域博主若此文你认为写的不错,不要吝啬你的赞扬,求收藏,求评论,求一个大大的赞!*文章若有错误或某个内容有更优的解决方案,还望指正!*Webpack了解webpack指南https://webpack.docschina.org/guides/webpack文档https://webpack.docschina.org/前
Webpack 概念速通:从入门到掌握构建工具的精髓
tabzzz
前端 webpack 前端
Webpack基本概念这里我们先简单熟悉下Webpack的基本概念,我们在搭建项目的时候都会要用到的!这里我们分享的着重点是基本概念而不是具体配置项和使用方法依赖图(dependencygraph)模式(mode)入口(entry)输出(output)加载器(loader)插件(plugin)源映射(SourceMaps)开发服务器(devServer)依赖图(dependencygraph)依赖
高级 - 总结
怕冷的火焰(~杰)
nodejs和webpack webpack
高级总结:我们从4个角度对webpack和代码进行了优化:1.提升开发体验使用SourceMap让开发或上线时代码报错能有更加准确的错误提示2.提升webpack打包构建速度使用HotModuleReplacement让开发时只重新编译打包更新变化了的代码,不变的代码使用缓存,从而使更新速度更快使用OneOf让资源文件一旦被某个loader处理了,就不会继续遍历了,打包速度更快使用Include
webpack 配置
weixin_44101835
webpack 前端 node.js
webpack.base.jsconstpath=require('path');constHtmlWebpackPlugin=require('html-webpack-plugin');constMiniCssExtractPlugin=require('mini-css-extract-plugin');modules.export=function(isDev){return{//入口文件
值得你学习的构建工具-Webpack5.0简化版--五大核心概念
双头雄狮
构建工具 学习 webpack
一、Webpack是什么简单来说,webpack就是一个用于现代JavaScript应用程序的静态打包工具,打包过程:从入口文件开始,构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将这些所有模块打包,它们均为静态资源,用于展示你的内容。Webpack5运行于Node.jsv10.13.0+的版本。二、为什么使用Webpack在以前我们开发一个项目的时候,会出现很多.css、.js等类似的
Webpack五大核心概念
前路茫茫——何处无香
webpack webpack
一、Entry入口(Entry)指示webpack以哪个文件为入口起点开始打包,分析构建内部依赖图。二、Output输出(Output)指示Webpack打包后的资源bundles输出到那里去,以及如何命名。三、LoaderLoader让Webpack能够取处理那些非JavaScript文件(Webpack自身子理解JavaScript)四、Plugins插件(Plugins)可以用于执行范围更广
vue IE因Promise无法显示解决办法
Yao请输入昵称
一、ie11打开vue2.0项目空白,控制台报错vuexrequiresaPromisepolyfillinthisbrowserPromise为ES6语法,有的浏览器不支持ES6,所以需要安装babel-polyfill来将ES6转换为浏览器可识别的ES5语法①npminstall--save-devbabel-polyfill②在main.js中引入import"babel-polyfill"
webpack - 五大核心概念和基本配置(打包一个简单HTML页面)
怕冷的火焰(~杰)
nodejs和webpack webpack node.js
//五大核心概念1.entry(入口)指示Webpack从哪个文件开始打包2.output(输出)指示Webpack打包完的文件输出到哪里去,如何命名等3.loader(加载器)webpack本身只能处理js,json等资源,其他资源如图片需要借助loader,webpack才能解析4.plugin(插件)扩展Webpack的功能5.mode(模式)主要有两种模式:开发模式(development
ES6 中的 Symbol 是什么?
隐逸王
前言记得刚找工作那会,几种数据类型是必问题,当时的答案一般都是七种——字符串(String)、数字(Number)、布尔(Boolean)、数组(Array)、对象(Object)、空(Null)、未定义(Undefined),时至今日,某些网络教程上还是这样的分类:不完整的分类其实,随着ECMAScript的发展和完善,在ES6(2015)和ES11(2020)中,又分别增加了Symbol和Bi
统一思想认识
永夜-极光
思想
1.统一思想认识的基础,才能有的放矢
原因:
总有一种描述事物的方式最贴近本质,最容易让人理解.
如何让教育更轻松,在于找到最适合学生的方式.
难点在于,如何模拟对方的思维基础选择合适的方式. &
Joda Time使用笔记
bylijinnan
java joda time
Joda Time的介绍可以参考这篇文章:
http://www.ibm.com/developerworks/cn/java/j-jodatime.html
工作中也常常用到Joda Time,为了避免每次使用都查API,记录一下常用的用法:
/**
* DateTime变化(增减)
*/
@Tes
FileUtils API
eksliang
FileUtils FileUtils API
转载请出自出处:http://eksliang.iteye.com/blog/2217374 一、概述
这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的类FilenameUtils跟FileUtils,其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装,开发中对文件的操作,几乎都可以在这个框架里面找到。 非常的好用。
各种新兴技术
不懂事的小屁孩
技术
1:gradle Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自动化构建工具。
现在构建系统常用到maven工具,现在有更容易上手的gradle,
搭建java环境:
http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/
搭建android环境:
http://m
tomcat6的https双向认证
酷的飞上天空
tomcat6
1.生成服务器端证书
keytool -genkey -keyalg RSA -dname "cn=localhost,ou=sango,o=none,l=china,st=beijing,c=cn" -alias server -keypass password -keystore server.jks -storepass password -validity 36
托管虚拟桌面市场势不可挡
蓝儿唯美
用户还需要冗余的数据中心,dinCloud的高级副总裁兼首席营销官Ali Din指出。该公司转售一个MSP可以让用户登录并管理和提供服务的用于DaaS的云自动化控制台,提供服务或者MSP也可以自己来控制。
在某些情况下,MSP会在dinCloud的云服务上进行服务分层,如监控和补丁管理。
MSP的利润空间将根据其参与的程度而有所不同,Din说。
“我们有一些合作伙伴负责将我们推荐给客户作为个
spring学习——xml文件的配置
a-john
spring
在Spring的学习中,对于其xml文件的配置是必不可少的。在Spring的多种装配Bean的方式中,采用XML配置也是最常见的。以下是一个简单的XML配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.or
HDU 4342 History repeat itself 模拟
aijuans
模拟
来源:http://acm.hdu.edu.cn/showproblem.php?pid=4342
题意:首先让求第几个非平方数,然后求从1到该数之间的每个sqrt(i)的下取整的和。
思路:一个简单的模拟题目,但是由于数据范围大,需要用__int64。我们可以首先把平方数筛选出来,假如让求第n个非平方数的话,看n前面有多少个平方数,假设有x个,则第n个非平方数就是n+x。注意两种特殊情况,即
java中最常用jar包的用途
asia007
java
java中最常用jar包的用途
jar包用途axis.jarSOAP引擎包commons-discovery-0.2.jar用来发现、查找和实现可插入式接口,提供一些一般类实例化、单件的生命周期管理的常用方法.jaxrpc.jarAxis运行所需要的组件包saaj.jar创建到端点的点到点连接的方法、创建并处理SOAP消息和附件的方法,以及接收和处理SOAP错误的方法. w
ajax获取Struts框架中的json编码异常和Struts中的主控制器异常的解决办法
百合不是茶
js json编码返回异常
一:ajax获取自定义Struts框架中的json编码 出现以下 问题:
1,强制flush输出 json编码打印在首页
2, 不强制flush js会解析json 打印出来的是错误的jsp页面 却没有跳转到错误页面
3, ajax中的dataType的json 改为text 会
JUnit使用的设计模式
bijian1013
java 设计模式 JUnit
JUnit源代码涉及使用了大量设计模式
1、模板方法模式(Template Method)
定义一个操作中的算法骨架,而将一些步骤延伸到子类中去,使得子类可以不改变一个算法的结构,即可重新定义该算法的某些特定步骤。这里需要复用的是算法的结构,也就是步骤,而步骤的实现可以在子类中完成。
 
Linux常用命令(摘录)
sunjing
crond chkconfig
chkconfig --list 查看linux所有服务
chkconfig --add servicename 添加linux服务
netstat -apn | grep 8080 查看端口占用
env 查看所有环境变量
echo $JAVA_HOME 查看JAVA_HOME环境变量
安装编译器
yum install -y gcc
【Hadoop一】Hadoop伪集群环境搭建
bit1129
hadoop
结合网上多份文档,不断反复的修正hadoop启动和运行过程中出现的问题,终于把Hadoop2.5.2伪分布式安装起来,跑通了wordcount例子。Hadoop的安装复杂性的体现之一是,Hadoop的安装文档非常多,但是能一个文档走下来的少之又少,尤其是Hadoop不同版本的配置差异非常的大。Hadoop2.5.2于前两天发布,但是它的配置跟2.5.0,2.5.1没有分别。 &nb
Anychart图表系列五之事件监听
白糖_
chart
创建图表事件监听非常简单:首先是通过addEventListener('监听类型',js监听方法)添加事件监听,然后在js监听方法中定义具体监听逻辑。
以钻取操作为例,当用户点击图表某一个point的时候弹出point的name和value,代码如下:
<script>
//创建AnyChart
var chart = new AnyChart();
//添加钻取操作&quo
Web前端相关段子
braveCS
web前端
Web标准:结构、样式和行为分离
使用语义化标签
0)标签的语义:使用有良好语义的标签,能够很好地实现自我解释,方便搜索引擎理解网页结构,抓取重要内容。去样式后也会根据浏览器的默认样式很好的组织网页内容,具有很好的可读性,从而实现对特殊终端的兼容。
1)div和span是没有语义的:只是分别用作块级元素和行内元素的区域分隔符。当页面内标签无法满足设计需求时,才会适当添加div
编程之美-24点游戏
bylijinnan
编程之美
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
public class PointGame {
/**编程之美
主页面子页面传值总结
chengxuyuancsdn
总结
1、showModalDialog
returnValue是javascript中html的window对象的属性,目的是返回窗口值,当用window.showModalDialog函数打开一个IE的模式窗口时,用于返回窗口的值
主界面
var sonValue=window.showModalDialog("son.jsp");
子界面
window.retu
[网络与经济]互联网+的含义
comsci
互联网+
互联网+后面是一个人的名字 = 网络控制系统
互联网+你的名字 = 网络个人数据库
每日提示:如果人觉得不舒服,千万不要外出到处走动,就呆在床上,玩玩手游,更不能够去开车,现在交通状况不
oracle 创建视图 with check option
daizj
视图 view oralce
我们来看下面的例子:
create or replace view testview
as
select empno,ename from emp where ename like ‘M%’
with check option;
这里我们创建了一个视图,并使用了with check option来限制了视图。 然后我们来看一下视图包含的结果:
select * from testv
ToastPlugin插件在cordova3.3下使用
dibov
Cordova
自己开发的Todos应用,想实现“
再按一次返回键退出程序 ”的功能,采用网上的ToastPlugins插件,发现代码或文章基本都是老版本,运行问题比较多。折腾了好久才弄好。下面吧基于cordova3.3下的ToastPlugins相关代码共享。
ToastPlugin.java
package&nbs
C语言22个系统函数
dcj3sjt126com
c function
C语言系统函数一、数学函数下列函数存放在math.h头文件中Double floor(double num) 求出不大于num的最大数。Double fmod(x, y) 求整数x/y的余数。Double frexp(num, exp); double num; int *exp; 将num分为数字部分(尾数)x和 以2位的指数部分n,即num=x*2n,指数n存放在exp指向的变量中,返回x。D
开发一个类的流程
dcj3sjt126com
开发
本人近日根据自己的开发经验总结了一个类的开发流程。这个流程适用于单独开发的构件,并不适用于对一个项目中的系统对象开发。开发出的类可以存入私人类库,供以后复用。
以下是开发流程:
1. 明确类的功能,抽象出类的大概结构
2. 初步设想类的接口
3. 类名设计(驼峰式命名)
4. 属性设置(权限设置)
判断某些变量是否有必要作为成员属
java 并发
shuizhaosi888
java 并发
能够写出高伸缩性的并发是一门艺术
在JAVA SE5中新增了3个包
java.util.concurrent
java.util.concurrent.atomic
java.util.concurrent.locks
在java的内存模型中,类的实例字段、静态字段和构成数组的对象元素都会被多个线程所共享,局部变量与方法参数都是线程私有的,不会被共享。
Spring Security(11)——匿名认证
234390216
Spring Security ROLE_ANNOYMOUS 匿名
匿名认证
目录
1.1 配置
1.2 AuthenticationTrustResolver
对于匿名访问的用户,Spring Security支持为其建立一个匿名的AnonymousAuthenticat
NODEJS项目实践0.2[ express,ajax通信...]
逐行分析JS源代码
Ajax nodejs express
一、前言
通过上节学习,我们已经 ubuntu系统搭建了一个可以访问的nodejs系统,并做了nginx转发。本节原要做web端服务 及 mongodb的存取,但写着写着,web端就
在Struts2 的Action中怎样获取表单提交上来的多个checkbox的值
lhbthanks
java html struts checkbox
第一种方法:获取结果String类型
在 Action 中获得的是一个 String 型数据,每一个被选中的 checkbox 的 value 被拼接在一起,每个值之间以逗号隔开(,)。
所以在 Action 中定义一个跟 checkbox 的 name 同名的属性来接收这些被选中的 checkbox 的 value 即可。
以下是实现的代码:
前台 HTML 代码:
003.Kafka基本概念
nweiren
hadoop kafka
Kafka基本概念:Topic、Partition、Message、Producer、Broker、Consumer。 Topic: 消息源(Message)的分类。 Partition: Topic物理上的分组,一
Linux环境下安装JDK
roadrunners
jdk linux
1、准备工作
创建JDK的安装目录:
mkdir -p /usr/java/
下载JDK,找到适合自己系统的JDK版本进行下载:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
把JDK安装包下载到/usr/java/目录,然后进行解压:
tar -zxvf jre-7
Linux忘记root密码的解决思路
tomcat_oracle
linux
1:使用同版本的linux启动系统,chroot到忘记密码的根分区passwd改密码 2:grub启动菜单中加入init=/bin/bash进入系统,不过这时挂载的是只读分区。根据系统的分区情况进一步判断. 3: grub启动菜单中加入 single以单用户进入系统. 4:用以上方法mount到根分区把/etc/passwd中的root密码去除 例如: ro
跨浏览器 HTML5 postMessage 方法以及 message 事件模拟实现
xueyou
jsonp jquery 框架 UI html5
postMessage 是 HTML5 新方法,它可以实现跨域窗口之间通讯。到目前为止,只有 IE8+, Firefox 3, Opera 9, Chrome 3和 Safari 4 支持,而本篇文章主要讲述 postMessage 方法与 message 事件跨浏览器实现。postMessage 方法 JSONP 技术不一样,前者是前端擅长跨域文档数据即时通讯,后者擅长针对跨域服务端数据通讯,p