资讯专栏INFORMATION COLUMN

从零开始搭建React同构应用(二):浏览器端工程化

wwq0327 / 3484人阅读

摘要:从零开始搭建同构应用二项目工程化浏览器端在从零开始同构开发一中我们已经能实现基本的配置和编译了。接下来我们需要将编译工作工程化。配置作用自动生成自动在引入,。文件内容如下同构开发配置自动刷新这里我们用到的修饰器特性。

从零开始搭建React同构应用(二) 项目工程化(浏览器端)

在从零开始React同构开发(一)中我们已经能实现基本的React配置和编译了。接下来我们需要将编译工作工程化。

代码

代码在这,建议下载后,对照着看,因为文章不方便把所有的代码贴上来

主要内容

项目目录结构优化

stylus样式文件的处理和打包

extract-text-webpack-plugin配置

html-webpack-plugin配置

配置browser-sync自动刷新(利用es6的decoratort特性)

项目目录结构优化

先看下整理后的目录结构

</>复制代码

  1. src
  2. ├─config //附加webpack配置文件
  3. ├─module
  4. │ ├─common //公共模块
  5. │ │ └─stylus
  6. │ ├─index //首页模块
  7. │ │ ├─component
  8. │ │ └─stylus
  9. │ │ └─img
  10. │ └─TodoDetail //todo详情模块
  11. │ └─stylus
  12. └─template //HTML模版

module文件夹放置了各个模块,我把页面以模块分类,每个模块下第一层的.jsx文件就是页面的入口文件(common除外)。

common模块文件夹放置一些公共组件、公共库、公共样式等。

template文件夹用于放置html-webpack-plugin用到的页面模版。

当然我还在探索更好的目录配置方式,大家如果有想法欢迎@我^_^。

添加npm script

我们先添加一条watch命令,用于开发环境的编译。

</>复制代码

  1. "scripts": {
  2. "watch": "webpack -d -w --progress --colors --bs",
  3. "test-server": "anywhere -p 18341 -d ./build"
  4. },
样式文件处理 css、stylus文件的处理

前篇文章我们只编译了jsx,我们还没引入样式,假设现在项目的css使用stylus来编写。那么可以参考以下配置。
我们需要3个loader:

stylus-loader

autoprefixer-loader

css-loader

vue-style-loader

file-loaderurl-loader

这些loaders大家肯定耳熟能详啦,可能大家会对vue-style-loader会有疑惑,这里解释下:

</>复制代码

  1. 因为在启用sourceMap的情况下,style-loaderbackground-image属性没有处理好,生成的URL链接开头为chrome:// urls,官方库中已经有人提issue了,。

后来尤雨溪大神fork了官方库后开发了vue-style-loader,完美的解决了background-image问题,当时发现这个库的时候真的感动的不行啊。。。

下面看一下样式文件loader的配置

</>复制代码

  1. loaders: [
  2. {
  3. test: /.(png|jpe?g|gif)/,
  4. loader: "url?limit=1024&name=img/[name].[ext]"
  5. }, {
  6. test: /.(ttf|eot|svg)$/,
  7. loader: "url?limit=1024&name=fonts/[name].[ext]"
  8. },
  9. {
  10. test: /.jsx?$/,
  11. exclude: /node_modules/,
  12. loader: "babel"
  13. },
  14. {
  15. test: /.(styl|css)$/,
  16. loader: "vue-style!css?sourceMap!autoprefixer!stylus")
  17. },
  18. ]

这样就可以愉快的在js中引入CSS啦

extract-text-webpack-plugin配置

有时候我们需要把CSS提取出来,多带带打包成一个文件,这时候需要用到extract-text-webpack-plugin

修改webpack.config.js

</>复制代码

  1. const ExtractTextPlugin = require("extract-text-webpack-plugin");

然后修改我们原有的styl-loader配置

</>复制代码

  1. {
  2. test: /.(styl|css)$/,
  3. loader: ExtractTextPlugin.extract(["vue-style"], "css?sourceMap!autoprefixer!stylus")
  4. },

我们还要在plugin字段配置输出的CSS文件名称

</>复制代码

  1. plugins:[
  2. new ExtractTextPlugin("css/[name].css"),
  3. ]

执行watch命令

</>复制代码

  1. `npm run watch`

可以看到css都被提取出来成为多带带的文件了。

html-webpack-plugin配置

作用:

自动生成HTML

自动在HTML引入jscss

自动添加hash。

我们在src/config新建html-webpack-plugin.config.js文件,由于配置HTML编译。

</>复制代码

  1. //html-webpack-plugin.config.js
  2. const HtmlWebpackPlugin = require("html-webpack-plugin");
  3. const path = require("path");
  4. module.exports = [
  5. new HtmlWebpackPlugin({
  6. filename: "index.html",
  7. chunks: ["common", "index"],
  8. template: path.resolve(__dirname, "../template/base.html"),
  9. hash: true,
  10. }),
  11. ]

修改webpack.config.js

执行watch命令

</>复制代码

  1. npm run watch

可以看到webpack帮我们自动生成了html文件。

index.html文件内容如下:

</>复制代码

  1. React同构开发Demo
配置browser-sync自动刷新

这里我们用到ES7的修饰器特性。目前transform-decorators只有第三方的实现。

以Index.jsx为例

先修改babel.rc文件:

</>复制代码

  1. {
  2. "presets": [
  3. "react",
  4. "es2015"
  5. ],
  6. "plugins": [
  7. "transform-regenerator",
  8. "transform-decorators-legacy" //添加这个
  9. ]
  10. }

在config文件夹添加browser-sync.config.js

修改webpack.config.js

在common文件夹添加bs.js

在React组件中引入bs.js

执行watch命令

</>复制代码

  1. `npm run watch`

刷新浏览器,看到下图说明自动刷新服务已经成功开启

webapck小技巧

减小路径的书写量

</>复制代码

  1. resolve: {
  2. extensions: [".jsx", ".js", ""],
  3. alias: {
  4. "common": path.join(__dirname, "module/common")
  5. }
  6. },

自动引入库,不用每次都写import

</>复制代码

  1. new webpack.ProvidePlugin({
  2. React: "react",
  3. ReactDOM: "react-dom",
  4. fetch: "isomorphic-fetch",
  5. promise: "promise"
  6. }),

区分生产和开发环境

</>复制代码

  1. new webpack.DefinePlugin({
  2. "process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV) || JSON.stringify("development"),
  3. }),

使用cross-env来跨平台设置环境变量

</>复制代码

  1. "scripts": {
  2. "watch": "webpack -d -w --progress --colors --bs",
  3. "test-server": "anywhere -p 18341 -d ./build",
  4. "dist": "cross-env NODE_ENV="production" webpack -p"
  5. }

提取公共js、css

</>复制代码

  1. new webpack.optimize.CommonsChunkPlugin({
  2. name: "common",
  3. filename: "js/common.js",
  4. }),

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81369.html

相关文章

  • 从零开始搭建React同构应用(三):配置SSR

    摘要:从零开始搭建同构应用三配置这篇文章来讲解来配置,我们先从最简单的方法开始,用的方式模拟实现。影响生产环境下执行效率。最后权衡下,还是决定使用现在多一套编译配置的方案。新建,写入以下内容以为例,注意不能少。 从零开始搭建React同构应用(三):配置SSR 这篇文章来讲解来配置server side render,我们先从最简单的方法开始,用cli的方式模拟实现SSR。 demo在这里 ...

    jzzlee 评论0 收藏0
  • 从零开始搭建React同构应用(四):搭建Koa Server & 完善SSR

    摘要:从零开始搭建同构应用四搭建完善上一篇我们使用了的方式测试了,这篇文章来讲如何在前文的基础上搭建一个,实现真正意义上的。至此,一个简单的框架已经搭建完成,剩下的工作就是结合工作需要,在里面添砖加瓦啦。 从零开始搭建React同构应用(四):搭建Koa Server & 完善SSR 上一篇我们使用了CLI的方式测试了SSR,这篇文章来讲如何在前文的基础上搭建一个Koa Server,实现真...

    fizz 评论0 收藏0
  • 20个灵魂拷问 彻底搞明白你就是中级前工程师 【中篇】

    摘要:前端个灵魂拷问,彻底搞明白你就是中级前端工程师上篇感觉大家比较喜欢看这种类型的文章,以后会多一些。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。此规范其实是在推广过程中产生的。 showImg(https://segmentfault.com/img/bVbwAMU?w=700&h=394); 前端20个灵魂拷问,彻底搞明白你就是中级前端工程师...

    MartinDai 评论0 收藏0
  • 20个灵魂拷问 彻底搞明白你就是中级前工程师 【中篇】

    摘要:前端个灵魂拷问,彻底搞明白你就是中级前端工程师上篇感觉大家比较喜欢看这种类型的文章,以后会多一些。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。此规范其实是在推广过程中产生的。 showImg(https://segmentfault.com/img/bVbwAMU?w=700&h=394); 前端20个灵魂拷问,彻底搞明白你就是中级前端工程师...

    coolpail 评论0 收藏0
  • React 服务渲染如此轻松 从零开始构建前后应用

    摘要:今天这篇文章显然不是讨论这两个词语的,我们要尝试使用最新版,构件一个简单的服务端渲染应用。这样取代了完全由客户端渲染前后端分离方式模式。在场景下,我们可以使用自身的完成服务端初次渲染。这也是它在推出短短时间以来,便迅速走红的原因之一。 参加或留意了最近举行的JSConf CN 2017的同学,想必对 Next.js 不再陌生, Next.js 的作者之一到场进行了精彩的演讲。其实在更早...

    binaryTree 评论0 收藏0

发表评论

0条评论

wwq0327

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<