webpack4.0初探

webpack4.0发布了一段时间了,本文稍微研究下

1.webpack-cli必须

默认安装了webpack,执行时,会报错,需要装上webpack-cli

2.不再需要webpack.config.js

默认情况下,已经不再需要这个配置文件,它已经有了最基本的配置,此时,我们执行了webpack命令,看看效果


image.png

一个警告,一个报错,忽略警告,看看报错,应该是需要一个src默认的文件保存路径,加上之后,再运行看看,警告依然在,但是错误没了,也生成了文件,在dist下面


image.png

3.mode有development和production模式

还记得层级的uglify-js之类的plugin吗,webpack4已经不需要了,提供了development和production模式

  "scripts": {
    "start": "webpack --mode development",
    "build": "webpack --mode production"
  }

4.默认对js的支持程度

class A{
    constructor(){
        alert('cccc')
    }
}
new A()
var B= ()=>{
    alert('arrow function')
}
B()

一开始,我用chrome(版本 63.0.3239.132(正式版本) (64 位))和ios11来访问,直接是好了,吓了一跳,以为连babel之类的都不用配置了,后来发现我的Mini2一直ios8,试着访问,alert失效,那肯定是不支持,又用了ie11,还是不支持,所以还是需要配置文件的,所以,webpack4所指的零配置,应该是entry,output,mode,本demo中,是在ios8下报这个错

TypeError: Map constructor does not accept arguments

从字面来看,应该是Map不支持,我在入口文件import 了babel-polyfill问题解决

5.css处理

曾经我们都是用extract-text-webpack-plugin这个来抽去css文件,webpack4中已经废弃了(Unfortunately said plugin does not play well with webpack 4.),推荐的是mini-css-extract-plugin

6.React hello world

由上面的结论,我们就可以来实现一个简单的react demo了,要做的事情,需要处理js,需要处理css,那么仍然需要config.js

const HtmlWebPackPlugin = require("html-webpack-plugin")
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
module.exports = {
    module: {
        rules: [{
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader",
                    options: {
                        presets: [
                            ["env", {
                                "targets": {
                                    "browsers": ["last 2 versions", "safari >= 7", "iOS >= 8"]
                                }
                            }], 'react'
                        ],
                        "plugins": [
                            "transform-runtime"
                        ]
                    }
                }
            },
            {
                test: /\.html$/,
                use: [{
                    loader: "html-loader"
                }]
            },
            {
                test: /\.scss$/,
                use: [MiniCssExtractPlugin.loader, "css-loader?modules=true", "sass-loader"]
            }
        ]
    },
    plugins: [
        new HtmlWebPackPlugin({
            template: "./src/index.html",
            filename: "./index.html"
        }),
        new MiniCssExtractPlugin({
            filename: "[name].css",
            chunkFilename: "[id].css"
        })
    ]
}

这是配置文件,主要是对js和scss做了处理,再看看react部分

import React, { Component } from "react"
import ReactDOM from "react-dom"
import styles  from './main.scss'
class App extends Component {
    componentDidMount() {
        console.log('ssssss:', styles)
    }
    render(){
      return (
        <div className={styles.test}>
          <p>Hello webpack4.0</p>
        </div>
      )
  }
};
export default App;
ReactDOM.render(<App />, document.getElementById("app"));

这样就实现了一个最简单的react demo

7. dev server

一般情况下,开发模式下,我们要启动一个服务,用于监听文件修改时页面的热加载,这个webpack为我们考虑好了,我们只需要按照如下配置即可

npm i webpack-dev-server --save-dev

然后定义一个命令用于启动服务

webpack-dev-server --mode development --open

由于我们使用了MiniCssExtractPlugin,这个时候在development下,scss修改,页面是不会刷新的,所以开发模式下,需要去掉css的抽取,改用如下的配置

use: ["style-loader", "css-loader?modules=true", "sass-loader"] 开发模式

8. redux

具体的redux的引用请看我以前的一篇文章https://www.jianshu.com/p/abf44b4a4c7c,或者参考https://github.com/chenbin2015/react-redux-es6-quickstart,本模块我们只介绍一些基本对象

8.1 redux

  • createStore
    用来创建一个store,并注册到provider中
  • combineReducer
    合并reducer
  • bindActionCreators
    将action绑定到组件上
    另外的applyMiddleWare和compose本demo暂不提及

8.2 react-redux

  • connect
  • Provider

9. 路由

路由的原理,可以参考https://www.jianshu.com/p/b66f56c65049,本文中使用react-router-redux,我们就按照官网的demo进行配置吧,看下具体变化

//没有开启服务端,所以使用hash
import createHistory from 'history/createHashHistory'
import { Route } from 'react-router'
import { ConnectedRouter, routerReducer, routerMiddleware } from 'react-router-redux'

import Home from './containers/Home'
import About from './containers/About'
import App from './containers/Demo'
const history = createHistory()
const middleware = routerMiddleware(history)
const store = createStore(
    combineReducers({
        reducers,
        router: routerReducer
    }),
    applyMiddleware(middleware)
)
<Provider store = { store } >
    <ConnectedRouter history={history}>
      <div>
        <Route exact path="/" component={Home}/>
        <Route path="/about" component={About}/>
      </div>
    </ConnectedRouter>
  </Provider>

建议还是了解原理吧,这边只是适应引用包的语法糖,没啥好说的

10. 按需加载

按需加载的原理,我以前讲过了,参考https://www.jianshu.com/p/b66f56c65049这个吧
目前react-route提供了react-loadable,这个能很方便地为我们实现按需加载的功能,一步步来即可
先安装react-router-redux,根据它的语法,我们还需要安装babel的一个插件babel-plugin-syntax-dynamic-import,接下来就是写我们的组件了

image.png

我们的组件分成了两部分
index.js

import React, { Component } from 'react'
import Loadable from 'react-loadable'
import Loading from '../Loading'

const LoadableComponent = Loadable({
  loader: () => import('./entry'),
  loading: Loading,
});

export default class App extends Component {
  render() {
    return <LoadableComponent/>;
  }
}

其中的loader是具体的组件内容,loading官方的说法是一个placeholder(loading is a placeholder component to show while the real component is loading),这个具体的有时间再研究下,目前看来就是在路由切换时有一个过渡的过程,主要的是loader,这个就是去引用具体的组件内容,接下来,我们执行下生产模式


image.png

图中的0和1就是按需生成的js文件,路由变化时,会去加载不同的js

目前,实现了开发模式和生产模式的简单配置,如果要用到线上,还需要eslint,immutable啥的,这里就不展开了,其实webpack4的出现,也是对曾经版本的继承与优化,要不断地随着技术的发展来提升自己即可,代码放到这里

参考资料:https://www.valentinog.com/blog/webpack-4-tutorial/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容