webpack 公共配置
|
STMU1320 commented on 4 Sep 2017
博主在打包这里没有讲清楚,webpack没有全局安装的话 webpack --config webpack.dev.config.js 命令会出错。要么全局安装,要么运行命令./node_modules/.bin/webpack --config webpack.dev.config.js |
@STMU1320 确实是,sorry。没注意~~ 谢谢谢谢。 |
|
surpass-wei commented on 6 Sep 2017
命令优化 处,应该是执行 |
@surpass-wei 哈哈哈哈哈。谢谢谢谢。。已经改了。 之前我的 |
yeliping commented on 7 Sep 2017
一般运行我建议,npm run dev, 发布测试版本包交npm run testbuild,正式版本叫npm run build。这样挺好 |
@yeliping 我看别人写的,基本一般运行都是 |
yeliping commented on 7 Sep 2017
我公司的vue框架,不是我搭的。在npm run testbuild和npm run build有区别的,区别就在于,打包了测试和正式环境,那些接口地址就不一样。免得混淆,测试地址上了正式地址的错误。楼主你那个打包压缩没弄错zip这种格式吧 |
@yeliping 打包压缩不是打包压缩成zip呀。。。没有这一步。 压缩是指代码压缩~ |
yeliping commented on 7 Sep 2017
我知道是指代码压缩呀,弄错zip这些可以再配置的 |
@yeliping 恩恩。下一步 我可以做这个。嘿嘿。 |
yeliping commented on 7 Sep 2017 •
`'use strict'; var exports = { }; module.exports = exports;` 这个文件就是用来配置测试环境或者正式环境。主要是以前有个新同事把测试发到正式,导致出现大问题.所以他们弄了这样的配置 |
@yeliping 我们开发时就没个问题的。可以把 |
@yeliping 当然因项目而异啦。 |
ranjin commented on 7 Sep 2017 •
在 |
@ranjin 祝你好运。 |
ranjin commented on 7 Sep 2017
也就是说 如果配置的是 |
@ranjin 可以加,也可以不加。 如果不加的话 就默认8080哦。 |
surpass-wei commented on 7 Sep 2017
向后台请求用户基本信息为例的例子中,一会是 |
@surpass-wei 确实是写错了。已经修正。谢谢你。 |
ranjin commented on 8 Sep 2017
看了一半了,不过概念性的东西实在太多了。 |
@ranjin 从我接触react到现在,也有快一年了吧。。。慢慢来,你先学会用别人搭好的现成的框架。熟悉怎么用之后,再来看怎么搭框架。 |
ranjin commented on 8 Sep 2017
嗯嗯。现在就是在看您这整个框架的。然后再慢慢来学习一些知识点的。 |
@ranjin JSX |
yeliping commented on 8 Sep 2017
嘿嘿,看了博主文章自己弄了一个,删了一些跟我项目不是很必要的东西,自己改了一点,不过总体还是挺好的。谢谢博主啦。redux我还是去补补,因为之前没怎么接触过。以前一直用angular1.x和vue、jq做项目 |
ranjin commented on 8 Sep 2017
@yeliping 我也感觉redux好绕啊。 |
@ranjin 是的,我最开始也不理解。 先学会用,用着用着就懂原理了。~你要明白, |
Ccheng2729111 commented on 13 Sep 2017
写的真的很不错,花了几个小时跟着走了一遍。以前项目都是脚手架create-react-app直接搭的。 |
Ccheng2729111 commented on 13 Sep 2017
不过感觉react-redux那块还可以详尽一点,多创建一个container,纯显示组件就放component里就行。逻辑相关的放container。 这样相信新手就可以少走弯路了:》 |
@Ccheng2729111 确实是,redux如果没用过,很难一下就讲清楚的。当时写的时候也考虑了很久~~还是没太讲明白。。。 我现在在准备写一篇从零开发一个redux。相信新手看了会豁然开朗 嘿嘿。 |
brickspert added the react label on 15 Sep 2017
AlenWang commented on 15 Sep 2017
本来是想看一下react入门,忽然最后关注点在webpack配置上。然而我们项目是vue2+webpack,看了之后对webpack配置理解更深刻了些,写的很赞了! |
@AlenWang 谢谢认可。 |
|
|
alexguo88 commented on 19 Sep 2017
万分感谢,学习框架,显得弄清楚构建工具的使用,以前一直迷迷糊糊的,按你的步骤一步一步作下来,清晰多了,很好的文章!!! |
@alexguo88 感谢你的认可。谢谢~~以后会有更多好文的、 |
ZHENGGEGE commented on 19 Sep 2017
很细致!一直用到webpack,却没有研究过,文章很棒 |
zhouxinghui commented on 20 Sep 2017 •
不开心 为什么部署到tomcat中报错误,我把dist文件放到tomcat 中 找不到css文件,js文件,文件明明都有,请问是为什么啊 @brickspert |
@zhouxinghui 你用的一级域名还是二级域名? |
zhouxinghui commented on 20 Sep 2017
没有用域名,我是说直接部署在本地的tomcat中运行一下,老板还没叫我部署到域名服务器上 @brickspert |
@zhouxinghui 我意思是 你部署到tomcat后,使用" http://localhost:80/index.html " 这种域名访问的?还是 " http://localhost:80/xxx/index.html " 这种域名访问的? 第二种配置确实访问不到静态文件的。如果你非要用第二种域名访问,要修改 |
zhouxinghui commented on 20 Sep 2017 •
我是用第二种,那怎么用第一种呢 ,不想修改那么多配置@brickspert |
@zhouxinghui tomcalt配置域名 http://localhost:80 直接指向xxx目录就可以了~~你现在肯定是指向xxx目录再外面的一层。 |
zhouxinghui commented on 20 Sep 2017 •
我在tomcat 中的服务器配置中的标签下加了这段 |
@zhouxinghui 差不多,我看 |
zhouxinghui commented on 20 Sep 2017
遇到一个问题 在tomcat中部署运行 重复刷新页面会报错误 只有主页重复刷新不报错误,其它页面都会报错误。 @brickspert |
@zhouxinghui 这是正常的,你要配置tomcat,让所有的页面请求都返回 除了静态文件和api请求哦~ |
zhouxinghui commented on 20 Sep 2017
这个怎么配啊 @brickspert |
@zhouxinghui 给你个关键字 “tomcat配置单页面应用”,你去查下吧。tomcat我没怎么用过唉~ |
zhouxinghui commented on 20 Sep 2017
我去查了 我没有找到 不知道是不是我查找的方法不对 还是没有 @brickspert |
@zhouxinghui 你看看这个吧 这里 他这里有apache和nginx的配置(大概意思可以参考,别原模原样复制哦)。 总的思想就是,所有页面请求,重定向到 |
zhouxinghui commented on 20 Sep 2017
我是在Windows下,没有他说的那个文件啊 tomcat我的是直接解压用的 @brickspert |
zhouxinghui commented on 20 Sep 2017 •
在 tomcat 上面简单的做法,在 web.xml 中加入 |
zhouxinghui commented on 20 Sep 2017
不过这样做还是有一个错误 那就是刷新页面的时候 还是会显示找不到页面 但是绑定了主页 所以主页会一直显示~ @brickspert |
@zhouxinghui 理解不了你的意思了~~~ 是都返回主页的,但是js会控制显示的页面的呢。。 怎么你的不行哩? |
zhouxinghui commented on 20 Sep 2017
不知道啊 楼主你在tomcat中试一试 估计也是一样的 要不我把配好的文件发给你 你看看 我用的是你github上的源码 @brickspert |
@zhouxinghui 我晚上下个tomcat 试试。没咋用过。 |
zhouxinghui commented on 20 Sep 2017
嗯嗯 好的 那就麻烦你了 @brickspert |
亲测可用。 |
zhouxinghui commented on 21 Sep 2017
Chrome浏览器 按F12 可以看到错误 不是页面上报错误 进入开发模式 刷新页面会报404 @brickspert |
@zhouxinghui 截个图发上来看看~ |
zhouxinghui commented on 21 Sep 2017 •
@zhouxinghui 我用我的方法测试了,没问题的。应该是你404页面配置的有问题。你按照我的来配应该就可以了、 |
zhouxinghui commented on 21 Sep 2017
我们的目录结构不一样啊 我把你的源码 dist文件夹拷贝到 Tomcat服务器中的webapps文件夹目录下 静态代码发布到Tomcat都是放在这个目录下的 @brickspert |
zhouxinghui commented on 21 Sep 2017
要是在生产环境 要怎么部署啊 @brickspert 上面你介绍的时候说拷贝dist文件夹 到服务器 我觉得不够清楚@brickspert |
|
zhouxinghui commented on 21 Sep 2017
我按你的那个配了 还是这样报错 @brickspert |
@zhouxinghui 这个我真的不知道了唉。我这边确实不报错的。tomcat文档看看吧,肯定是tomcat配置的问题~~。~~ |
zhouxinghui commented on 21 Sep 2017
好吧 那这个项目怎么和后端的连接起来啊 @brickspert |
Pegggy commented on 22 Sep 2017
redux 教程那里, Counter 组件我照博主的代码打出错啦。 class Counter extends Component{
render(){
return(
<div>
<div>显示当前计数为{this.props.counter}</div> //这里 props 应该就到 counter,不然不显示数字
<button onClick = {()=>this.props.increment()}>自增</button>
<button onClick = {()=>this.props.decrement()}>自减</button>
<button onClick = {()=>this.props.reset()}>重置</button>
</div>
)
}
}
const mapStateToProps = (state) =>{
return {
counter: state.count,//这里应该是 state.count 不是 counter,不然编译完会报错
}
}
|
@Pegggy 亲,应该是你搞错了吧,亲。 看这里,我们在这里定义的是
|
yichonglai commented on 24 Sep 2017
vendor文件没经过babel处理??? |
@yichonglai 我是这样理解的。babel只处理src文件夹里面的代码(我们配置的),用 |
yichonglai commented on 25 Sep 2017
\node_modules\webpack-dev-server\client |
@yichonglai 不应该啊,webpack-dev-server不会打包进vendor的呀~~ 截个图看看。 |
yichonglai commented on 25 Sep 2017
yichonglai commented on 25 Sep 2017
@yichonglai 等我研究下 然后给你回复哦~ |
|
xinkuan-jack commented on 28 Sep 2017
无法兼容ie,好心塞 |
@xinkuan-jack 这里我写了这个框架如何兼容ie8的~~ 看这里 #5 |
xinkuan-jack commented on 28 Sep 2017
@brickspert 不考虑ie8了,ie9+能运行就ok,问题还是 @yichonglai 显示的那个问题,转码规则制定了,打包后文件还是es6 |
@xinkuan-jack 你是说开发(npm start)的时候兼容ie9 还是 生产坏境(npm run build)之后兼容ie9呢? |
@xinkuan-jack 我测试了,打包之后是兼容ie9+的,你开发的时候不要用ie9开发啊~ |
@tingyuxuan2302 报错说的是,你配置文件写的不对,你配置一个 |
sanshuiwang commented on 18 Oct 2017
笔者,留个QQ或者微信,有问题好请教嘛! |
sanshuiwang commented on 19 Oct 2017
我想抽取scss还是像抽取css一样吗? |
@sanshuiwang 没理解你的意思。 scss和css是一样的哦。 |
firstsmarts commented on 30 Oct 2017
谢谢分享 获益良多 |
zhangtianxiao commented on 30 Oct 2017
辛苦了, |
xuezhenxiang commented on 3 Nov 2017
谢谢分享! |
xintianyou commented on 8 Nov 2017
谢谢提主的分享,相当精彩! |
xintianyou commented on 8 Nov 2017
上面的QQ群加不进 |
@xintianyou 可以加了 |
xintianyou commented on 8 Nov 2017
@brickspert 谢谢 |
JaydenLD commented on 8 Nov 2017
@JaydenLD 可以把报错信息贴出来。是不是你有文件引用了这样的路径 |
JaydenLD commented on 9 Nov 2017
@JaydenLD |
JaydenLD commented on 9 Nov 2017
@JaydenLD 哈~这里你写错了,应该这么写的,这里。 |
JaydenLD commented on 9 Nov 2017
@JaydenLD 你把我源码下载下来,对比一下吧~ 我这么看也看不出的 |
JaydenLD commented on 9 Nov 2017
好的,还是谢谢啦 |
FrankHuPerficient commented on 10 Nov 2017
博主厉害了。写得很清晰。谢谢分享。 |
lm5645 commented on 10 Nov 2017
打包优化的命令是错的:现在npm run bundle试试,是不是之前的都清空了。当然我们之前的api文件夹也被清空了,不过没关系哦~本来就是测试用的。build |
JaydenLD commented on 10 Nov 2017
昨天下午已经按照这个重新来了一遍,是因为当时我install的依赖没有下载进去,json文件里没有,所以路径改了也会报错 |
@lm5645 谢谢。已经改正了。thank you~ |
@JaydenLD 可以用了就好~祝你好运 |
git-issue commented on 10 Nov 2017
写得很不错,谢谢楼主分享 |
nanxiaodi commented on 15 Nov 2017
robinLiu1989 commented on 15 Nov 2017
@nanxiaodi,我遇到了和你同样的问题 |
@nanxiaodi @robinLiu1989
|
nanxiaodi commented on 16 Nov 2017
用服务器发布就好了,我找了一下原因,第一是,出口配置不弄成绝对路径,publice:'./'变成相对路径就可以访问资源了,然后是子页面的路由设置,是BrowserRouter好像必须要服务器支持,改成hashrouter就可以在本地运行了 |
robinLiu1989 commented on 16 Nov 2017
@brickspert 在本地开了一个服务器,确实可以,谢谢楼主~ |
brickspert closed this on 16 Nov 2017
ZGahou commented on 16 Nov 2017
@ZGahou 你肯定知道,我们这是单页面应用。我们只有一个文件Index.html~ |
ZGahou commented on 16 Nov 2017
browserRouter会重新请求服务器,webpack-dev-server怎么配置能让404返回index.html |
@ZGahou 原来你在开发模式呀,其实你往后看,后面就有写到开发模式如何处理的。 |
ZGahou commented on 16 Nov 2017
之前没发现这个的用处,没加上,现在可以了,多谢楼主 |
@ZGahou 这样最好了,完全理解这个字段了。下次碰到肯定记住了。嘿嘿。碰到问题,解决问题后才能记住。 |
ZGahou commented on 16 Nov 2017
是啊,现在记住了devServer里有这么个配置可以起到这个作用 |
FrankHuPerficient commented on 16 Nov 2017
@TrustTheBoy 将运行命令写在package.json中就可以了 |
brickspert reopened this on 16 Nov 2017
@TrustTheBoy 你看报错信息, |
TrustTheBoy commented on 17 Nov 2017 •
@brickspert 您好,感谢你的帮助,我的Router确实是一个子节点,我也对照了你的源码 |
@TrustTheBoy |
@TrustTheBoy 我看着也没啥问题。。尴尬。你下载我的源码对比下吧。看不出来哪里错了~~ 如果最后还不行,晚上我 可以帮你调试下。 |
TrustTheBoy commented on 17 Nov 2017 •
@brickspert 是不是和react && react-dom的版本有关呢?我用的全是新版本 |
@TrustTheBoy 应该不是的~~不过你可以尝试的。 |
TrustTheBoy commented on 17 Nov 2017
@brickspert 您好,想问下,如果按" http://localhost:80/xxx/index.html " 这种域名访问的,publicPath这里需要如何配置呢?还有路由需要怎么改动呢? |
|
@TrustTheBoy hello~
|
@TrustTheBoy 我意思是这个路径下的所有404,定位到index.html。。。不是说服务器上所有的。。 |
|
xiaofuyesnew commented on 24 Nov 2017 •
打算把koa和这个脚手架放在一起,做一个全栈的脚手架,koa处理后端逻辑为前端提供REST API,前端处理交互逻辑和页面,另外的话,想一想其实ORM也可以放进来。数据库用MongoDB,用js实现完全的全栈。 |
TrustTheBoy commented on 27 Nov 2017
现在的问题是,this.props拿到的全是{},里面啥都没有Link.to传的参数也传不过去 |
@TrustTheBoy 在什么地方拿不到?~截图看看。 |
TrustTheBoy commented on 27 Nov 2017 •
@brickspert 能否发个QQ或者什么联系方式呢?我的QQ:603049583 |
TrustTheBoy commented on 27 Nov 2017 •
比如我用Link <Link to={{ pathname: `/details/${item.id}`, query: { foo: 'bar', boo: 'boz' }}} key={i}>
<ListItem
primaryText={item.name}
rightIcon={<HardwareKeyboardBackspace />}
style={{ borderBottomWidth:0.1,borderBottomColor:'#e5e5e5',borderBottomStyle:'solid',backgroundColor:'#fff' }} />
</Link>
然后details这个页面this.props获取也是{} |
HuYuee commented on 28 Nov 2017
写的很详细!? |
@TrustTheBoy 我加你了。 |
purpletastes commented on 29 Nov 2017
@dushengling 你往下看。下面一点点我就写了这个问题。 |
purpletastes commented on 30 Nov 2017
purpletastes commented on 30 Nov 2017
@purpletastes 不是进度条,是百分比进度~ 第二个这个,肯定是你代码写错了。。。。你仔细看看哪里没写对。 |
purpletastes commented on 1 Dec 2017
@brickspert 谢谢,还是没有找到原因。能不能加一下你,有很多问题想请教一下 |
@purpletastes 你告诉我你QQ ,我拉你进群。 |
robinLiu1989 commented on 4 Dec 2017
@brickspert 这样为什么不行? |
brickspert deleted a comment from purpletastes on 4 Dec 2017
@robinLiu1989 你是想用这种域名
总结来说,js引用,htmlwebpackplugin会自动给你插入的,不用你自己去写的。 |
gejialun8888 commented on 7 Dec 2017 •
@gejialun8888 用 |
gejialun8888 commented on 8 Dec 2017
谢谢啊 @brickspert ,但是在项目不知道怎么写最合适,还是相关代码或者项目案例提供一下给做个参考呢 |
|
gejialun8888 commented on 8 Dec 2017
@brickspert 太感谢了,可以了,升级的成本太高了,方便加个QQ:516736959 |
brickspert deleted a comment from JackZs on 8 Dec 2017
brickspert deleted a comment from JackZs on 8 Dec 2017
kkkkzero00 commented on 12 Dec 2017
请问一下公共的webpack文件抽离出来后,执行开发模式或者生产模式的时候指令 指向的文件会发生变化吗?比如 "dev": "webpack-dev-server --config webpack.dev.config.js --color --progress",里面到底是指向 webpack.dev.config.js还是 webpack.dev.common.js |
@kkkkzero00 不用改的哦。还是老样子。 |
shenhailong commented on 13 Dec 2017
@brickspert 楼主太棒了!!!对于我这种不上不下的学习者来说很实用。跟着写了一遍,webpack的也基本走通了,希望能多出更多的学习教程 |
qianlanse commented on 13 Dec 2017
@brickspert 在刷新那一节,修改后为啥我浏览器没有刷新呢倒是编译文件了,164295410求加进群 |
@qianlanse 代码你再对比下。肯定是代码写错了哦。尤其是 |
@shenhailong 谢谢。很开心能帮到你~ |
使用 CSS Modules关于什么是 可以去看阮一峰的文章CSS Modules 用法教程 修改以下几个地方:
enjoy it! |
robinLiu1989 commented on 14 Dec 2017
@brickspert 这种单页面应用,分享链接时,比如www.test.com/detail。别人需要直接访问www.test.com/detail这个地址,该这么弄,看前文是链接到index,有没有办法直接跳到指定页面呢? |
@robinLiu1989 就是直接访问 |
@robinLiu1989 那是你服务器这边配置的不对哦。 |
nixiaowei commented on 14 Dec 2017
不得不说,这篇文章全是干货~~~ 给楼主点个赞~~~ |
robinLiu1989 commented on 14 Dec 2017
@brickspert 可以了,谢谢 |
@nixiaowei 谢谢 |
zhh877644371 commented on 14 Dec 2017
请问一下,最后一个“使用 CSS Modules模块”中,不需要安装什么依赖吗,我之前都没问题,最后按照步骤来修改文件,npm start报错了,感觉像是依赖的问题 @brickspert 楼主的分享很棒,能不能把我也拉到群里一起学习,我的qq是877644371 |
不用安装依赖的哦~ 这句就是开启css modules模式的。 另外,我看你报错信息说是 |
zhh877644371 commented on 14 Dec 2017
是图片没找到...我用的是自己的图片,jpg名字不对,太不细心了...感谢楼主的分享~ |
HeavenSky commented on 15 Dec 2017 •
首先谢谢砖家大大的分享,不过我提一点点新人的建议,希望相互学习和相互进步。
const createComponent = (modFn) => props => (
<Bundle load={modFn}>
{
(WaitingComponent) => WaitingComponent ? <WaitingComponent {...props}/> : <Loading {...props}/>
}
</Bundle>
);
说实话,之前都叫component的时候我理解了好久好久,建议命名更语义化一点component太通用,容易误解,其实第一个小写的component是一个回调函数,第二个首字母大写的Component才是加载完成的组件.另外因为没有将props给传递给bundle-load的组件,所以这些组件无法获取location,history等信息 因为我也是最近几个月学习react(十一国庆假开始学的),最近一个半月开始准备自己配webpack(自用,公司用的gulp,没法参考),按照你的项目代码,自己也写了react一个最新的支持ie9,一个支持到ie8的,不过我因为想用ant design所以配置上有很多不同,也弃用了redux,(redux是好东西但是很多时候可以不用) |
HeavenSky commented on 15 Dec 2017
|
@HeavenSky 感谢您的建议,非常感谢。
|
HeavenSky commented on 15 Dec 2017
我对应写了两个项目
|
zyt-cloud commented on 18 Dec 2017
为啥polyfill不单独抽出一个文件来 |
使用 json-server 代替 Mock.jsjson-server和
我们用
let Mock = require('mockjs');
var Random = Mock.Random;
module.exports = function () {
var data = {};
data.user = {
'name': Random.cname(),
'intro': Random.word(20)
};
return data;
};
devServer: {
...
proxy: {
"/api/*": "http://localhost:8090/$1"
}
}
哦了,你可以 问题: |
apawn commented on 19 Dec 2017
博主写的很好很详细, 给了我很大帮助 thank you |
ZGahou commented on 20 Dec 2017
@ZGahou 这个确实是个问题。
|
ZGahou commented on 20 Dec 2017
谢谢楼主,那旧的版本有这个bug吗,我现在用的版本是3.0.0 |
@ZGahou 据我上次测试,旧版本也没用了~~ 下个版本这个bug就修复了。得等等了。= =! |
ZGahou commented on 20 Dec 2017
好的,谢谢楼主 |
kkkkzero00 commented on 20 Dec 2017
@xinkuan-jack #5 |
BackToHappyBear commented on 26 Dec 2017
楼主,我想在一个action后 获取数据 再执行另一个action,好像在 afterSuccess 中执行 并不可以? |
@BackToHappyBear 可以的。 |
added a commit to beeant0512/react-family-ie8 that referenced this issueon 26 Dec 2017
lxh3811958 commented on 4 Jan
楼主,我也要申请加入组织,2467057727 |
fanpengfei510 commented on 5 Jan
写的太好了,很详细也很实用,申请进组织,可以和大家多交流。598796448 |
Caixiaozhi commented 28 days ago
求入群!1006219023! |
@cdLVV @Caixiaozhi 群号:572071150 |
ZGahou commented 28 days ago
楼主你好,怎么加svg的配置 |
@ZGahou |
cokecole commented 27 days ago
楼主 热加载那儿按上面那样写的 但是不起作用但是每次保存都会更新显示 webpack: Compiled successfully. |
@cokecole 572071150 |
wj15510151110 commented 27 days ago
396553000 |
ghost2113 commented 26 days ago •
@ghost2113 用了路由跳转之后,就不能用 |
huangdeyao commented 26 days ago
怎么集成蚂蚁的antd? |
wangwenfan commented 21 days ago
@wangwenfan 程序启动起来,会打包好文件放到dist文件夹的,打包的文件放在内存中,是无法看到的。 看看你的 无法访问看看报错信息是什么? |
mengwuhen commented 15 days ago
你好,我想问一下 上边的教程 我自己操作了一遍,想结合ant-design 搭建一个系统的静态页面 ,但是发现antd的样式没有加载进来。请问这种情况下 webpack该如何配置,谢谢 |
li2290 commented 12 days ago
大神请问一下源代码html文件中的内联样式能通过什么插件打包进去吗 |
@li2290 不是很懂你的意思。 |
em14Vito commented 8 days ago
@brickspert 楼主好,按照你的步骤走到react那儿,打包的时候就报错了: |
@em14Vito 你好,应该是你的配置文件没写对。可以把 webpack配置文件贴出来看看。 |
em14Vito commented 7 days ago •
@brickspert webpack.dev.config package.jason 其实都是跟你上面写的是一样 : ( |
CJHHappy commented 7 days ago
你这篇文章确实写得很好,很细致,最主要的就是没有用太多的官方术语去表达知识,而是用了通俗易懂的语言去描述,这里大家就肯定能听得懂,也知道什么东西是干什么事的。也能体现出来你自己的理解。通俗易懂,不错。建议像这类的文章,有精力你应该多写几篇。 |
@em14Vito 亲,你看下你的 |
@CJHHappy 这段时间太忙了,等过完年了,肯定会继续写的。 |
em14Vito commented 7 days ago
@brickspert 是在下眼瞎了,谢啦 ? |
JashonWang commented 6 days ago
写得真不错 |
问题修复1. react热模块加载无效举例:在首页中,当我们计数加上去,然后修改代码,计数又恢复成0了。也就是热模块加载的时候,重置了 如果我们不使用 解决问题参考这里:https://github.com/gaearon/react-hot-loader/tree/next#code-splitting 解决步骤:
import {hot} from 'react-hot-loader';
...
export default hot(module)(Home);
其他模块如果需要,可以自己同理修改哦。 |
ilovekerry commented 2 hours ago
connect接收两个参数,一个mapStateToProps,就是把redux的state,转为组件的Props,还有一个参数是mapDispatchToprops, 先来安装react-redux npm install --save react-redux src/pages/Counter/Counter.js import React, {Component} from 'react'; |
@ilovekerry 没写错的,你注意下“文件路径优化”这一节。要加路径别名配置的哦 |
brickspert commented on 2 Sep 2017 •
从零搭建React全家桶框架教程
源码地址:https://github.com/brickspert/react-family
提问反馈:blog
大家阅读的时候,照着目录来阅读哦,有些章节不在文章里面。要点链接的~
目录
axios
和middleware
优化API请求webpack
公共配置 webpack-common-config(2017-09-04)当我第一次跟着项目做
react
项目的时候,由于半截加入的,对框架了解甚少,只能跟着别人的样板写。对整个框架没有一点了解。做项目,总是要解决各种问题的,所以每个地方都需要去了解,但是对整个框架没有一个整体的了解,实在是不行。
期间,我也跟着别人的搭建框架的教程一步一步的走,但是经常因为自己太菜,走不下去。在经过各种蹂躏之后,对整个框架也有一个大概的了解,
我就想把他写下来,让后来的菜鸟能跟着我的教程对
react
全家桶有一个全面的认识。我的这个教程,从新建根文件夹开始,到成型的框架,每个文件为什么要建立?建立了干什么?每个依赖都是干什么的?一步一步写下来,供大家学习。
当然,这个框架我以后会一直维护的,也希望大家能一起来完善这个框架,如果您有任何建议,欢迎在这里留言,欢迎
fork
源码react-family。我基于该框架
react-family
又做了一个兼容IE8的版本,教程在这里react-family框架兼容IE8教程。cd src/pages mkdir Home
创建文件夹并进入
mkdir react-family && cd react-family
init npm
npm init
按照提示填写项目基本信息安装
webpack
npm install --save-dev webpack
Q: 什么时候用
--save-dev
,什么时候用--save
?A:
--save-dev
是你开发时候依赖的东西,--save
是你发布之后还依赖的东西。看这里根据webpack文档编写最基础的配置文件
新建
webpack
开发配置文件touch webpack.dev.config.js
webpack.dev.config.js
学会使用
webpack
编译文件新建入口文件
mkdir src && touch ./src/index.js
src/index.js
添加内容document.getElementById('app').innerHTML = "Webpack works"
现在我们执行命令
webpack --config webpack.dev.config.js
我们可以看到生成了
dist
文件夹和bundle.js
。现在我们测试下~
dist
文件夹下面新建一个index.html
touch ./dist/index.html
dist/index.html
填写内容用浏览器打开
index.html
,可以看到Webpack works
!现在回头看下,我们做了什么或者说
webpack
做了什么。把入口文件
index.js
经过处理之后,生成bundle.js
。就这么简单。通俗的说,就是我们可以用ES6, ES7等来编写代码,Babel会把他们统统转为ES5。
npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react babel-preset-stage-0
新建
babel
配置文件.babelrc
touch .babelrc
.babelrc
修改
webpack.dev.config.js
,增加babel-loader
!现在我们简单测试下,是否能正确转义ES6~
修改
src/index.js
执行打包命令
webpack --config webpack.dev.config.js
浏览器打开
index.html
,我们看到正确输出了我现在在使用Babel!
然后我们打开打包后的
bundle.js
,翻页到最下面,可以看到箭头函数被转换成普通函数了!Q:
babel-preset-state-0
,babel-preset-state-1
,babel-preset-state-2
,babel-preset-state-3
有什么区别?A: 每一级包含上一级的功能,比如
state-0
包含state-1
的功能,以此类推。state-0
功能最全。具体可以看这篇文章:babel配置-各阶段的stage的区别参考地址:
https://segmentfault.com/a/1190000008159877
http://www.ruanyifeng.com/blog/2016/01/babel.html
npm install --save react react-dom
修改
src/index.js
使用react
执行打包命令
webpack --config webpack.dev.config.js
打开
index.html
看效果。我们简单做下改进,把
Hello React
放到组件里面。体现组件化~按照React语法,写一个Hello组件
然后让我们修改
src/index.js
,引用Hello
组件!src/index.js
在根目录执行打包命令
webpack --config webpack.dev.config.js
打开
index.html
看效果咯~Q:每次打包都得在根目录执行这么一长串命令
webpack --config webpack.dev.config.js
,能不打这么长吗?A:修改
package.json
里面的script
,增加dev-build
。package.json
现在我们打包只需要执行
npm run dev-build
就可以啦!参考地址:
http://www.ruanyifeng.com/blog/2016/10/npm_scripts.html
npm install --save react-router-dom
新建
router
文件夹和组件按照
react-router
文档编辑一个最基本的router.js
。包含两个页面home
和page1
。src/router/router.js
新建页面文件夹
新建两个页面
Home
,Page1
填充内容:
src/pages/Home/Home.js
Page1.js
现在路由和页面建好了,我们在入口文件
src/index.js
引用Router。修改
src/index.js
现在执行打包命令
npm run dev-build
。打开index.html
查看效果啦!那么问题来了~我们发现点击‘首页’和‘Page1’没有反应。不要惊慌,这是正常的。
我们之前一直用这个路径访问
index.html
,类似这样:file:///F:/react/react-family/dist/index.html
。这种路径了,不是我们想象中的路由那样的路径
http://localhost:3000
~我们需要配置一个简单的WEB服务器,指向index.html
~有下面两种方法来实现Nginx
,Apache
,IIS
等配置启动一个简单的的WEB服务器。webpack-dev-server
来配置启动WEB服务器。下一节,我们来使用第二种方法启动服务器。这一节的DEMO,先放这里。
参考地址
http://www.jianshu.com/p/e3adc9b5f75c
http://reacttraining.cn/web/guides/quick-start
简单来说,
webpack-dev-server
就是一个小型的静态文件服务器。使用它,可以为webpack
打包生成的资源文件提供Web服务。npm install webpack-dev-server --save-dev
修改
webpack.dev.config.js
,增加webpack-dev-server
的配置。webpack.dev.config.js
现在执行
webpack-dev-server --config webpack.dev.config.js
浏览器打开http://localhost:8080,OK,现在我们可以点击
首页
,Page1
了,看URL地址变化啦!我们看到
react-router
已经成功了哦。Q:
--content-base
是什么?A:
URL的根目录。如果不设定的话,默认指向项目根目录。
重要提示:webpack-dev-server编译后的文件,都存储在内存中,我们并不能看见的。你可以删除之前遗留的文件
dist/bundle.js
,仍然能正常打开网站!
每次执行
webpack-dev-server --config webpack.dev.config.js
,要打很长的命令,我们修改package.json
,增加script->start
:下次执行
npm start
就可以了。既然用到了
webpack-dev-server
,我们就看看它的其他的配置项。看了之后,发现有几个我们可以用的。
console
中打印彩色日志404
响应都被替代为index.html
。有什么用呢?你现在运行npm start
,然后打开浏览器,访问http://localhost:8080
,然后点击Page1
到链接http://localhost:8080/page1
,然后刷新页面试试。是不是发现刷新后
404
了。为什么?dist
文件夹里面并没有page1.html
,当然会404
了,所以我们需要配置historyApiFallback
,让所有的404
定位到index.html
。host
,默认是localhost
。如果你希望服务器外部可以访问,指定如下:host: "0.0.0.0"
。比如你用手机通过IP访问。Webpack
的模块热替换特性。关于热模块替换,我下一小节专门讲解一下。8080
端口。localhost:3000
上有后端服务的话,你可以这样启用代理:根据这几个配置,修改下我们的
webpack-dev-server
的配置~webpack.dev.config.js
CLI ONLY
的需要在命令行中配置package.json
现在我们执行
npm start
看看效果。是不是看到打包的时候有百分比进度?在http://localhost:8080/page1
页面刷新是不是没问题了?用手机通过局域网IP是否可以访问到网站?
参考地址:
到目前,当我们修改代码的时候,浏览器会自动刷新,不信你可以去试试。(如果你的不会刷新,看看这个调整文本编辑器)
我相信看这个教程的人,应该用过别人的框架。我们在修改代码的时候,浏览器不会刷新,只会更新自己修改的那一块。我们也要实现这个效果。
我们看下webpack模块热替换教程。
我们接下来要这么修改
package.json
增加--hot
src/index.js
增加module.hot.accept()
,如下。当模块更新的时候,通知index.js
。src/index.js
现在我们执行
npm start
,打开浏览器,修改Home.js
,看是不是不刷新页面的情况下,内容更新了?惊不惊喜?意不意外?做模块热替换,我们只改了几行代码,非常简单的。纸老虎一个~
现在我需要说明下我们命令行使用的
--hot
,可以通过配置webpack.dev.config.js
来替换,向文档上那样,修改下面三处。但我们还是用
--hot
吧。下面的方式我们知道一下就行,我们不用。同样的效果。HRM
配置其实有两种方式,一种CLI
方式,一种Node.js API
方式。我们用到的就是CLI
方式,比较简单。Node.js API
方式,就是建一个server.js
等等,网上大部分教程都是这种方式,这里不做讲解了。你以为模块热替换到这里就结束了?no
nono~上面的配置对
react
模块的支持不是很好哦。例如下面的
demo
,当模块热替换的时候,state
会重置,这不是我们想要的。修改
Home.js
,增加计数state
src/pages/Home/Home.js
你可以测试一下,当我们修改代码的时候,
webpack
在更新页面的时候,也把count
初始为0了。为了在
react
模块更新的同时,能保留state
等页面中其他状态,我们需要引入react-hot-loader~Q: 请问
webpack-dev-server
与react-hot-loader
两者的热替换有什么区别?A: 区别在于
webpack-dev-serve
r自己的--hot
模式只能即时刷新页面,但状态保存不住。因为React
有一些自己语法(JSX)是HotModuleReplacementPlugin
搞不定的。而
react-hot-loader
在--hot
基础上做了额外的处理,来保证状态可以存下来。(来自segmentfault)下面我们来加入
react-hot-loader v3
,安装依赖
npm install react-hot-loader@next --save-dev
根据文档,
我们要做如下几个修改~
.babelrc
增加react-hot-loader/babel
.babelrc
webpack.dev.config.js
入口增加react-hot-loader/patch
webpack.dev.config.js
src/index.js
修改如下src/index.js
现在,执行
npm start
,试试。是不是修改页面的时候,state
不更新了?参考文章:
做到这里,我们简单休息下。做下优化~
在之前写的代码中,我们引用组件,或者页面时候,写的是相对路径~
比如
src/router/router.js
里面,引用Home.js
的时候就用的相对路径webpack提供了一个别名配置,就是我们无论在哪个路径下,引用都可以这样
下面我们来配置下,修改
webpack.dev.config.js
,增加别名~webpack.dev.config.js
然后我们把之前使用的绝对路径统统改掉。
src/router/router.js
src/index.js
我们这里约定,下面,我们会默认配置需要的别名路径,不再做重复的讲述哦。
接下来,我们就要就要就要集成
redux
了。要对
redux
有一个大概的认识,可以阅读阮一峰前辈的Redux 入门教程(一):基本用法如果要对
redux
有一个非常详细的认识,我推荐阅读中文文档,写的非常好。读了这个教程,有一个非常深刻的感觉,redux
并没有任何魔法。不要被各种关于 reducers, middleware, store 的演讲所蒙蔽 ---- Redux 实际是非常简单的。
当然,我这篇文章是写给新手的,如果看不懂上面的文章,或者不想看,没关系。先会用,多用用就知道原理了。
开始整代码!我们就做一个最简单的计数器。自增,自减,重置。
先安装
redux
npm install --save redux
初始化目录结构
先来写
action
创建函数。通过action
创建函数,可以创建action
~src/redux/actions/counter.js
再来写
reducer
,reducer
是一个纯函数,接收action
和旧的state
,生成新的state
.src/redux/reducers/counter.js
一个项目有很多的
reducers
,我们要把他们整合到一起src/redux/reducers.js
到这里,我们必须再理解下一句话。
reducer
就是纯函数,接收state
和action
,然后返回一个新的state
。看看上面的代码,无论是
combineReducers
函数也好,还是reducer
函数也好,都是接收state
和action
,返回更新后的
state
。区别就是combineReducers
函数是处理整棵树,reducer
函数是处理树的某一点。接下来,我们要创建一个
store
。前面我们可以使用
action
来描述“发生了什么”,使用action
创建函数来返回action
。还可以使用
reducers
来根据action
更新state
。那我们如何提交
action
?提交的时候,怎么才能触发reducers
呢?store
就是把它们联系到一起的对象。store
有以下职责:state
;getState()
方法获取state
;dispatch(action)
触发reducers
方法更新state
;subscribe(listener)
注册监听器;subscribe(listener)
返回的函数注销监听器。src/redux/store.js
到现在为止,我们已经可以使用
redux
了~下面我们就简单的测试下
src/redux/testRedux.js
当前文件夹执行命令
是不是看到输出了
state
变化?做这个测试,就是为了告诉大家,
redux
和react
没关系,虽说他俩能合作。到这里,我建议你再理下
redux
的数据流,看看这里。store.dispatch(action)
提交action
。redux store
调用传入的reducer
函数。把当前的state
和action
传进去。reducer
应该把多个子reducer
输出合并成一个单一的state
树。Redux store
保存了根reducer
返回的完整state
树。就是酱紫~~
这会
webpack.dev.config.js
路径别名增加一下,后面好写了。webpack.dev.config.js
把前面的相对路径都改改。
下面我们开始搭配
react
使用。写一个
Counter
页面src/pages/Counter/Counter.js
修改路由,增加
Counter
src/router/router.js
npm start
看看效果。下一步,我们让
Counter
组件和Redux
联合起来。使Counter
能获得到Redux
的state
,并且能发射action
。当然我们可以使用刚才测试
testRedux
的方法,手动监听~手动引入store
~但是这肯定很麻烦哦。react-redux
提供了一个方法connect
。connect
接收两个参数,一个mapStateToProps
,就是把redux
的state
,转为组件的Props
,还有一个参数是mapDispatchToprops
,就是把发射
actions
的方法,转为Props
属性函数。先来安装
react-redux
npm install --save react-redux
src/pages/Counter/Counter.js
下面我们要传入
store
src/index.js
到这里我们就可以执行
npm start
,打开localhost:8080/counter看效果了。但是你发现
npm start
一直报错WTF?这个错误困扰了半天。我说下为什么造成这个错误。我们引用
redux
的时候这样用的import {createStore} from 'redux'
然而,我们在
webapck.dev.config.js
里面这样配置了然后
webapck
编译的时候碰到redux
都去src/redux
去找了。但是找不到啊。所以我们把webpack.dev.config.js
里面redux
这一行删除了,就好了。并且把使用我们自己使用
redux
文件夹的地方改成相对路径哦。现在你可以
npm start
去看效果了。这里我们再缕下(可以读React 实践心得:react-redux 之 connect 方法详解)
Provider
组件是让所有的组件可以访问到store
。不用手动去传。也不用手动去监听。connect
函数作用是从Redux state
树中读取部分数据,并通过 props 来把这些数据提供给要渲染的组件。也传递dispatch(action)
函数到props
。接下来,我们要说异步
action
参考地址: http://cn.redux.js.org/docs/advanced/AsyncActions.html
想象一下我们调用一个异步
get
请求去后台请求数据:isLoading
置为true
。isLoading
置为false
,data
填充数据。isLoading
置为false
,显示错误信息。下面,我们以向后台请求用户基本信息为例。
user.json
,等会请求用,相当于后台的API接口。dist/api/user.json
action
创建函数。src/redux/actions/userInfo.js
我们创建了请求中,请求成功,请求失败三个
action
创建函数。reducer
再强调下,
reducer
是根据state
和action
生成新state
的纯函数。src/redux/reducers/userInfo.js
这里的
...state
语法,是和别人的Object.assign()
起同一个作用,合并新旧state。我们这里是没效果的,但是我建议都写上这个哦组合
reducer
src/redux/reducers.js
现在有了
action
,有了reducer
,我们就需要调用把action
里面的三个action
函数和网络请求结合起来。dispatch getUserInfoRequest
dispatch getUserInfoSuccess
dispatch getUserInfoFail
src/redux/actions/userInfo.js
增加我们这里发现,别的
action
创建函数都是返回action
对象:{type: xxxx}
但是我们现在的这个
action
创建函数getUserInfo
则是返回函数了。为了让
action
创建函数除了返回action
对象外,还可以返回函数,我们需要引用redux-thunk
。npm install --save redux-thunk
这里涉及到
redux
中间件middleware
,我后面会讲到的。你也可以读这里Middleware。简单的说,中间件就是
action
在到达reducer
,先经过中间件处理。我们之前知道reducer
能处理的action
只有这样的{type:xxx}
,所以我们使用中间件来处理函数形式的
action
,把他们转为标准的action
给reducer
。这是redux-thunk
的作用。使用
redux-thunk
中间件我们来引入
redux-thunk
中间件src/redux/store.js
到这里,
redux
这边OK了,我们来写个组件验证下。src/pages/UserInfo/UserInfo.js
这里你可能发现
connect
参数写法不一样了,mapStateToProps
函数用了es6
简写,mapDispatchToProps
用了react-redux
提供的简单写法。增加路由
src/router/router.js
现在你可以执行
npm start
去看效果啦!到这里
redux
集成基本告一段落了,后面我们还会有一些优化。combinReducers优化
redux
提供了一个combineReducers
函数来合并reducer
,不用我们自己合并哦。写起来简单,但是意思和我们自己写的
combinReducers
也是一样的。src/redux/reducers.js
现在我们发现一个问题,代码哪里写错了,浏览器报错只报在
build.js
第几行。这让我们分析错误无从下手。看这里。
我们增加
webpack
配置devtool
!src/webpack.dev.config.js
增加这次看错误信息是不是提示的很详细了?
同时,我们在
srouce
里面能看到我们写的代码,也能打断点调试哦~先说这里为什么不用
scss
,因为Windows
使用node-sass
,需要先安装 Microsoft Windows SDK for Windows 7 and .NET Framework 4。我怕有些人copy这份代码后,没注意,运行不起来。所以这里不用
scss
了,如果需要,自行编译哦。npm install css-loader style-loader --save-dev
css-loader
使你能够使用类似@import
和url(...)
的方法实现require()
的功能;style-loader
将所有的计算后的样式加入页面中; 二者组合在一起使你能够把样式表嵌入webpack
打包后的JS文件中。webpack.dev.config.js
rules
增加我们用
Page1
页面来测试下src/pages/Page1/Page1.css
src/pages/Page1/Page1.js
好了,现在
npm start
去看效果吧。npm install --save-dev url-loader file-loader
webpack.dev.config.js
rules
增加options limit 8192
意思是,小于等于8K的图片会被转成base64
编码,直接插入HTML中,减少HTTP
请求。我们来用
Page1
测试下给
images
文件夹放一个图片。修改代码,引用图片
src/pages/Page1/Page1.js
可以去看看效果啦。
为什么要实现按需加载?
我们现在看到,打包完后,所有页面只生成了一个
build.js
,当我们首屏加载的时候,就会很慢。因为他也下载了别的页面的js
了哦。如果每个页面都打包了自己单独的JS,在进入自己页面的时候才加载对应的js,那首屏加载就会快很多哦。
在
react-router 2.0
时代, 按需加载需要用到的最关键的一个函数,就是require.ensure()
,它是按需加载能够实现的核心。在4.0版本,官方放弃了这种处理按需加载的方式,选择了一个更加简洁的处理方式。
传送门
根据官方示例,我们开搞
npm install bundle-loader --save-dev
新建
bundle.js
src/router/Bundle.js
src/router/router.js
现在你可以
npm start
,打开浏览器,看是不是进入新的页面,都会加载自己的JS的~但是你可能发现,名字都是
0.bundle.js
这样子的,这分不清楚是哪个页面的js
呀!我们修改下
webpack.dev.config.js
,加个chunkFilename
。chunkFilename
是除了entry
定义的入口js
之外的js
~现在你运行发现名字变成
home.js
,这样的了。棒棒哒!那么问题来了
home
是在哪里设置的?webpack
怎么知道他叫home
?其实在这里我们定义了,
router.js
里面import Home from 'bundle-loader?lazy&name=home!pages/Home/Home';
看到没。这里有个
name=home
。嘿嘿。参考地址:
想象一下这个场景~
我们网站上线了,用户第一次访问首页,下载了
home.js
,第二次访问又下载了home.js
~这肯定不行呀,所以我们一般都会做一个缓存,用户下载一次
home.js
后,第二次就不下载了。有一天,我们更新了
home.js
,但是用户不知道呀,用户还是使用本地旧的home.js
。出问题了~怎么解决?每次代码更新后,打包生成的名字不一样。比如第一次叫
home.a.js
,第二次叫home.b.js
。文档看这里
我们照着文档来
webpack.dev.config.js
每次打包都用增加
hash
~现在我们试试,是不是修改了文件,打包后相应的文件名字就变啦?
但是你可能发现了,网页打开报错了~因为你
dist/index.html
里面引用js
名字还是bundle.js
老名字啊,改成新的名字就可以啦。啊~那岂不是我每次编译打包,都得去改一下js名字?欲知后事如何,且看下节分享。
这个插件,每次会自动把js插入到你的模板
index.html
里面去。npm install html-webpack-plugin --save-dev
新建模板
index.html
src/index.html
修改
webpack.dev.config.js
,增加plugin
npm start
运行项目,看看是不是能正常访问啦。~说明一下:
npm start
打包后的文件存在内存中,你看不到的。~ 你可以把遗留dist/index.html
删除掉了。想象一下,我们的主文件,原来的
bundle.js
里面是不是包含了react
,redux
,react-router
等等这些代码??这些代码基本上不会改变的。但是,他们合并在
bundle.js
里面,每次项目发布,重新请求bundle.js
的时候,相当于重新请求了react
等这些公共库。浪费了~我们把
react
这些不会改变的公共库提取出来,用户缓存下来。从此以后,用户再也不用下载这些库了,无论是否发布项目。嘻嘻。webpack
文档给了教程,看这里webpack.dev.config.js
把
react
等库生成打包到vendor.hash.js
里面去。但是你现在可能发现编译生成的文件
app.[hash].js
和vendor.[hash].js
生成的hash
一样的,这里是个问题,因为呀,你每次修改代码,都会导致vendor.[hash].js
名字改变,那我们提取出来的意义也就没了。其实文档上写的很清楚,但是无奈,如果用
chunkhash
,会报错。和webpack-dev-server --hot
不兼容,具体看这里。现在我们在配置开发版配置文件,就向
webpack-dev-server
妥协,因为我们要用他。问题先放这里,等会我们配置正式版webpack.config.js
的时候要解决这个问题。文档看这里
我们要开始做了~
在
webpack.dev.config.js
的基础上先做以下几个修改~webpack-dev-server
相关的东西~devtool
的值改成cheap-module-source-map
hash
改成chunkhash
webpack.config.js
在
package.json
增加打包脚本"build":"webpack --config webpack.config.js"
然后执行
npm run build
~看看dist
文件夹是不是生成了我们发布要用的所有文件哦?接下来我们还是要优化正式版配置文件~
webpack
使用UglifyJSPlugin
来压缩生成的文件。npm i --save-dev uglifyjs-webpack-plugin
webpack.config.js
npm run build
发现打包文件大小减小了好多。webpack.config.js
npm run build
后发现vendor.[hash].js
又变小了。刚才我们把
[name].[hash].js
变成[name].[chunkhash].js
后,npm run build
后,发现
app.xxx.js
和vendor.xxx.js
不一样了哦。但是现在又有一个问题了。
你随便修改代码一处,例如
Home.js
,随便改变个字,你发现home.xxx.js
名字变化的同时,vendor.xxx.js
名字也变了。这不行啊。这和没拆分不是一样一样了吗?我们本意是vendor.xxx.js
名字永久不变,一直缓存在用户本地的。~
官方文档推荐了一个插件HashedModuleIdsPlugin
现在你打包,修改代码再试试,是不是名字不变啦?错了,现在打包,我发现名字还是变了,经过比对文档,我发现还要加一个
runtime
代码抽取,加上这句话就好了~为什么呢?看下解释。
注意,引入顺序在这里很重要。CommonsChunkPlugin 的 'vendor' 实例,必须在 'runtime' 实例之前引入。
想象一个场景,我们的静态文件放在了单独的静态服务器上去了,那我们打包的时候,如何让静态文件的链接定位到静态服务器呢?
看文档Public Path
webpack.config.js
output
中增加一个publicPath
,我们当前用/
,相对于当前路径,如果你要改成别的url
,就改这里就好了。你现在打开
dist
,是不是发现好多好多文件,每次打包后的文件在这里混合了?我们希望每次打包前自动清理下dist
文件。npm install clean-webpack-plugin --save-dev
webpack.config.js
现在
npm run build
试试,是不是之前的都清空了。当然我们之前的api
文件夹也被清空了,不过没关系哦~本来就是测试用的。目前我们的
css
是直接打包进js
里面的,我们希望能单独生成css
文件。我们使用extract-text-webpack-plugin来实现。
npm install --save-dev extract-text-webpack-plugin
webpack.config.js
npm run build
后发现单独生成了css
文件哦axios
和middleware
优化API请求先安装下axios
npm install --save axios
我们之前项目的一次API请求是这样写的哦~
action
创建函数是这样的。比我们现在写的fetch
简单多了。然后在dispatch(getUserInfo())后,通过
redux
中间件来处理请求逻辑。中间件的教程看这里
我们想想中间件的逻辑
dispatch
REQUEST
请求。dispatch
SUCCESS
请求,如果定义了afterSuccess()
函数,调用它。dispatch
FAIL
请求。来写一个
src/redux/middleware/promiseMiddleware.js
修改
src/redux/store.js
来应用这个中间件修改
src/redux/actions/userInfo.js
是不是简单清新很多啦?
修改
src/redux/reducers/userInfo.js
action.userInfo
修改成了action.result.data
。你看中间件,请求成功,会给action
增加一个result
字段来存储响应结果哦~不用手动传了。npm start
看看我们的网络请求是不是正常哦。使用自动编译代码时,可能会在保存文件时遇到一些问题。某些编辑器具有“安全写入”功能,可能会影响重新编译。
要在一些常见的编辑器中禁用此功能,请查看以下列表: