webpack+react项目初体验——记录我的webpack环境配置

这两天学习了一些webpack的知识,loaders+plugins真的很强大!不过配置起来也很复杂,看了一些文章,自己也写了项目练手,写下来加深自己的印象。

首先,非常非常推荐的几篇文章,初学者一定要看!
<入门Webpack,看这篇就够了>
http://www.jianshu.com/p/42e1...
(标题一点也不夸张,非常适合0基础)
<Webpack傻瓜式指南>
https://zhuanlan.zhihu.com/p/...
https://zhuanlan.zhihu.com/p/...
https://zhuanlan.zhihu.com/p/...
(这个系列有三篇文章,第三章是一个webpack+react的小项目,跟着做一遍会很有收获~)

另外,也推荐看一下阮一峰es6书中module这一章,弄清楚export/import/export default等等命令,毕竟webpack的各个模块是靠export/import/require(commonjs)链接起来的,所以这些都要掌握。

具体到项目的话,webpack有几个比较基本的概念:
1、loaders:通过不同的loaders,webpack可以处理各式各样的文件,然后打包到一个文件中(比如bundle.js);
2、plugins:plugins是为了拓展webpack的功能的,和loaders不同的是,loader是用来处理单个文件的(比如json-loader处理.json,sass-loader处理.scss),但是plugins是直接对整个构建过程进行处理(比如自动生成html文件的html-webpack-plugin);
3、others: 这些我也不知道要归到哪里去,但是在配置中也是必不可少,包括webpack-dev-server/source-map等等,后面会具体说;
4、配置文件:我这个小项目包括的文件有.babelrc(用来处理babel),webpack.config.js(webpack项目基础配置文件),package.json(这个文件会记录所有的devDependencies)。

然后我们就一项一项来分析吧:

1、loaders

1) style-loader / css-loader / sass-loader

这几个loader用来处理.css和.scss文件,一起安装用空格隔开:

$ npm install --save-dev style-loader css-loader sass-loader

同时修改webpack.config.js:

module: {
        loaders: [
        {
            test: /\.scss$/,//loaders是依靠正则表达式来测试这个文件是不是这个loader来处理,所以test不能少
            loaders: ['style-loader','css-loader','sass-loader'],//"-loader"一定要写,不然会报错
            //loaders的处理顺序是从右向左,就是会先用sass-loader,其次css-loader,再次style-loader
        }
2) url-loader

这个loader是用来处理url链接,就是图片或者其他静态文件。
安装:

$ npm install --save-dev url-loader

webpack.config.js (写在module里):

{
            test: /\.(png|jpq)$/,loader: 'url? limit = 40000'
        }
3) json-loader

安装和配置和之前一样~用来处理json文件

4) babel相关的loaders:

这个包括的就比较多,有babel-core/babel-loader/babel-preset-es2015/babel-preset-react,后面两个是为了写es6和react服务。

//webpack.config.js
        {
            test: /\.jsx$/,loader:'babel-loader',include: APP_PATH,//这个include是说只对这里面的文件负责,还有一个对应的exclude,就是忽略范围内的文件,比如:exclude: './node_modules/';
        }

另外因为babel需要写的选项比较多,可以配一个.babelrc在根目录下:

//.babelrc
{
    'presets':['react','es2015'],}
}

以上就是用的比较多的loaders,配完这些webpack就可以处理json/sass/es6啦~

2、plugins

1) html-webpack-plugin

这个插件的作用就是自动生成html(其实也可以自己写,就是加了个bundle.js的script而已,不过感觉比较酷):
plugins安装好了之后要放在webpack.config.js的plugins的数组里,不要写在modules里呀~

//webpack.config.js
    plugins: [
        new HtmlWebpackPlugin({
        //在最前面先定义下HtmlWebpackPlugin--
        //var HtmlWebpackPlugin = require('html-webpack-plugin');
            title: 'searchBar',//配合html-webpack-plugin的配置
        })
    ],
2) react-transform-hrm

HMR是一个webpack插件,它让你能浏览器中实时观察模块修改后的效果,但是如果你想让它工作,需要对模块进行额外的配额;
Babel有一个叫做react-transform-hrm的插件,可以在不对React模块进行额外的配置的前提下让HMR正常工作;
安装:

$ npm install --save-dev babel-plugin-react-transform react-transform-hmr

配置:

//webpack.config.js (plugins里)
new webpack.HotModuleReplacementPlugin();

然后修改下.babelrc:

{
  "presets": ["react","es2015"],"env": {
    "development": {
    "plugins": [["react-transform",{
       "transforms": [{
         "transform": "react-transform-hmr","imports": ["react"],"locals": ["module"]
       }]
     }]]
    }
  }
}

这样在使用react的时候就可以热加载模块了~

3)UglifyJsPlugin:

压缩JS代码;

4)ExtractTextPlugin:

分离CSS和JS文件;
以上两个插件这次没有用,先记下来下次用过了再来补~

3、others

1) webpack-dev-server

用来构建本地开发的服务器,可以让浏览器监测代码的修改,并自动刷新修改后的结果;
安装:

$npm --save-dev webpack-dev-server

webpack-dev-server有以下几个配置选项:

  • contentBase:默认webpack-dev-server会为根文件夹提供本地服务器,如果想为另外一个目录下的文件提供本地服务器,应该在这里设置其所在目录(本例设置到“public"目录)

  • port:设置默认监听端口,如果省略,默认为”8080“

  • inline:设置为true,当源文件改变时会自动刷新页面

  • historyApiFallback:在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向index.html

    //webpack.config.js
    devServer: {
               contentBase: "./public",//本地服务器所加载的页面所在的目录
               historyApiFallback: true,//不跳转
               inline: true//实时刷新
           }
//package.json
 "scripts": {
    "start": "webpack-dev-server --inline",}

然后就可以用http://localhost:8080/index.html预览项目啦~

2)source-map:

source maps提供了一种对应编译文件和源文件的方法,使得编译后的代码可读性更高,也更容易调试。
在学习阶段和写中、小型项目的时候,用eval-source-map,如果是开发大型项目可以用cheap-module-eval-source-map,会更快。

//webpack.config.js
devtool: 'eval-source-map',
3) 第三方库:

这个就包括一些我们比较了解的比如react/react-dom/jquery/moment/bootstrap等等啦,配置起来也很方便,首先是安装:

$npm --save-dev jquery moment react react-dom
$npm install bootstrap@4.0.0-alpha.2 --save-dev

然后在你需要的js文件里引用这些库:

import React from 'react';
import ReactDOM from 'react-dom';

var $ = require('jquery');
var moment = require('moment');

然后就可以愉快地写各种js、jsx文件啦~

4、配置文件

最后我们来讲一讲几个配置文件的问题:

1) webpack.config.js

上面提到的都是各种肢解,我这次的config文件是这样的:

var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var ROOT_PATH = path.resolve(__dirname);
var APP_PATH = path.resolve(ROOT_PATH,'app');
var BUILD_PATH = path.resolve(ROOT_PATH,'build');

module.exports = {
    devtool: 'eval-source-map',entry: __dirname + '/app/index.jsx',//webpack的入口文件只有一个,所以写的所有components甚至包括css/json什么的,都要引用在这里
output:{
    path: __dirname +'/public',filename: 'bundle.js',},//我这边是新建了一个folder叫public,用来放index.html和bundle.js
devServer: {
    contentBase: "./public",//本地服务器所加载的页面所在的目录
    historyApiFallback: true,//不跳转
    inline: true//实时刷新
},plugins: [
    new HtmlWebpackPlugin({
        title: 'searchBar',//配合html-webpack-plugin的配置
    })
],module: {
    loaders: [
    {
        test: /\.scss$/,loaders: ['style-loader',{
        test: /\.(png|jpq)$/,loader: 'url? limit = 40000'
    },{
        test: /\.jsx$/,}]
},resolve:{
        extensions: ['','.js','.jsx']
    },};
2) package.json

这个文件会在你最开始npm init的时候就生成,一路回车就可以,后来都可以改~

{
  "name": "serach-bar","version": "1.0.0","description": "","main": "index.js","scripts": {
    "dev": "webpack-dev-server --progress --profile --colors --hot","build": "webpack --progress --profile --colors","test": "karma start"
  },//scripts这边可以改一下,改start可以,在终端用npm start,上面有例子~这边的dev要改的话在终端的命令是'npm run dev;
  "author": "","license": "ISC","devDependencies": {
    "babel-core": "^6.22.1","babel-loader": "^6.2.10","babel-plugin-react-transform": "^2.0.2","babel-preset-es2015": "^6.22.0","babel-preset-react": "^6.22.0","babel-preset-react-hmre": "^1.1.1","bootstrap": "^4.0.0-alpha.2","css-loader": "^0.26.1","file-loader": "^0.10.0","html-webpack-plugin": "^2.28.0","jquery": "^3.1.1","jshint": "^2.9.4","jshint-loader": "^0.8.3","json-loader": "^0.5.4","node-sass": "^4.5.0","react": "^15.4.2","react-dom": "^15.4.2","react-transform-catch-errors": "^1.0.2","react-transform-hmr": "^1.0.4","redbox-react": "^1.3.3","sass-loader": "^4.1.1","style-loader": "^0.13.1","url-loader": "^0.5.7","webpack": "^2.2.1","webpack-dev-server": "^2.3.0"
  }
}

装了很多dev,其实用不着那么多哈哈~

3) .babelrc
{
    'presets':['react','env':{
    'development':{
    'presets':['react-hmre']
    }
    }
}

ok,这样就差不多啦~另外还要注意的是index.jsx/index.js,所有的components都要引用过来,css/scss也是,css文件的话最好有一个main.css进行整合,这样不会漏掉。
看一眼这次的index.jsx:

// '注意这些import
import '../node_modules/bootstrap/scss/bootstrap.scss';
import './main.scss';
import React from 'react';
import ReactDOM from 'react-dom';
import Search from './components/search';
import Plist from './components/plist';

class App extends React.Component{
    constructor(props){
        super(props);
        this.state={'keyword':''};
        this.refreshKeyword = this.refreshKeyword.bind(this);
    }
    refreshKeyword(name){
        this.setState({'keyword':name});
    }
    render(){
        return (
            <div className = 'container'>
                <section className = 'jumbotron'>
                    <h3 className ='jumbotron-heading'>Search Github Users</h3>
                    <Search sendAction = {this.refreshKeyword} />
                </section>
                <Plist keyword={this.state.keyword} />
            </div>
                )
    }
};

const app = document.createElement('div');
document.body.appendChild(app);
ReactDOM.render(<App />,app);

恩,差不多就是这样啦~~项目初始化的时候不要忘记npm install --save-dev webpack哦!coding愉快!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom