R-1.使用webpack构建工程

        有没有经历过想学习ES6的最新语法,却苦于没有合适的编程环境,不知道如何做才能让ES6的代码跑起来,别人的Less或者sass写的样式可以很好的加载到页面上,自己写的却明明没有语法错误,怎么也没用。其实这都是他们所需要的依赖没有给到位,那么问题就来了,我怎么知道他要依赖啥?
说两个点:
        1、现在浏览器还不支持ES6语法,所以使用ES6及以上版本都需要进行编译:ES6/7/8-->ES5。
        2、SASS/LESS都是CSS预处理器语言,并不能直接引用到HTML中,只有编译成CSS才可以。

搭建好的工程在文章最下方有GitHub链接。

一. 简要了解webpack

        刚接触前端的都知道webpack是一种非常强大的打包工具,但是,哪里强大?能打森么包?怎么用的?有什么好处?能解决什么问题?好像就直接就这样了。

纳尼???

        所以很多人是只听其名不知其意,更不知其用法。先上个链接:webpack中文文档,英文好的可以直接看源文档!可以理解为他是一个打包机,他可以处理各种文件,如less/sass/html/js等,可以打你想要的各种包,也可以结合node.js执行各种脚本来优化项目。它还能做如代码分割和懒加载,打包长缓存,图片转码base64,优化代码体积以及压缩图片等。
我们在这里会讲些什么呢?看下图

思维导图webpack部分

二. 开始构建

先放个目录结构图完整的即整个工程构建后的目录,很简单的。


目录结构图-完整

1.创建一个空工程

        新建一个空文件夹,然后从命令窗口进入该目录下执行命令

npm init

        一路回车即可,我新建的是一个react-study空文件夹,执行这个命令之后会生成一个package.json文件。然后在里面创建src文件夹,在src文件夹下新建一个study文件夹和一个style文件夹,study用来存放js文件,style用来存放样式文件,如CSS或者SCSS等。在创建一个index.html文件,主要用来做模板,使用HTMLwebpackplugin插件时候会用到。同src同级创建一个public文件夹,什么不用放。最后我们在study文件夹下新建一个main.js文件,随便打几个汉字都可以。

2.添加依赖包

我们根据webpack思维导图需要安装以下几个包
(1).首先是我们需要使用webpack,则先安装webpack。

npm install --save-dev webpack

(2).处理CSS,SCSS样式文件需要使用
        css-loader:遍历所有css文件并处理
        style-loader:把样式插入到页面的style标签中
        postcss-loader,autoprefixer:帮CSS自动添加前缀
        sass-loader,node-sass:处理.scss文件,把.scss文件编译成.css文件。这俩必须放在一起,因为sass-loader依赖于node-sass,在sass-loader中的loader.js中有引用node-sass.
进行安装( npm install 命令简写形式 npm i )

npm i --save-dev css-loader style-loader postcss-loader autoprefixer sass-loader node-sass

(3).babel处理ES6语法
        babel-core:babel的核心包,babel编译器本身,主要提供babel编译API。
        ( ps:babel-preset-某某 是babel编译过程中所用到的插件。 )
        babel-preset-env:根据配置的目标环境自动采用需要的babel插件
        babel-preset-stage-0:兼容ES6以及更高版本语法以及工能特性
        babel-loader:转换js文件

npm i --save-dev babel-core babel-preset-env babel-preset-stage-0 babel-loader

(4).安装react相关依赖
        react:使用react所需要的包
        react-dom:使用react-dom需要用的包
        babel-preset-react:babel进行编译时需要的react相关插件
顺便把需要的模板插件HTMLwebpackplugin安装了一起。

npm i --save-dev react react-dom babel-preset-react html-webpack-plugin 

至此我们所需要的所有依赖都安装完成了,现在可以去看看package.json文件,我们所安装的依赖包括版本都已经记录在案了。后面如果用到了其他依赖也是这样安装!

3.编写webpack的配置文件

前面我们简单介绍了webpack就是一个打包器,来处理各种文件,这样理解我们现在要做的就简单多了。官网上说我们可以写一个配置文件名字叫webpack.config.js,注意这个名字是固定的且位置是在工程的最外层,使用webpack命令的时候会自动加载这个文件。

// webpack.config.js内容
const path = require('path');
module.exports = {
context: path.resolve('./src'),
entry: __dirname + '/src/study/main.js',
output: {
    path: __dirname + "/public",
    filename: "js/bundle.js"
},
module: {
    rules: [
        {
            test: /(\.jsx|\.js)$/,
            use: {
                loader: "babel-loader",
            },
            exclude: /node_modules/
        },
    ]
},
} 

从最外层看配置属性全部都放在一个对象实例中(放在{})。这反应了两个信息,
第一:wepack配置就是一个对象,学习webpack就是在学习webpack属性,学习属性那就找文档查清楚我所用的属性是什么作用,是什么类型的值。
第二:既然是对象实例,我按照规则无论写在什么地方,写多少个配置文件都是可行的,只要webpack执行时可以加载到该配置就可以。

        依次介绍上述配置文件中的每一个属性(这里并不主要讲解webpack,但是会告诉你学习它的途径和方法
先介绍一个比较笨但是我觉得比较有效的方法:看别人写的webpack配置,遇到不懂的字段属性去webpack官方文档去查,建议最好是去源文档看。下面解析过程中举个context的例子,给希望想深入学习webpack的童鞋一个途径。
        打开webpack文档,通过右上方的搜索图标直接搜索属性比如context

webpack文档首页
context

        context:绝对路径,解析的入口点,webpack进行各种文件解析的时候就是从这目录的。默认值是当前文件路径,建议设置这个值,这样可以和当前工作目录区分开。
        entry:整个项目的入口文件,从这个文件开始会找到这个文件中所有依赖的文件以及其他文件中依赖的其他文件。我们设置的是当前工作目录下的src/study/main.js文件为入口文件。
        output:有入口就有出口,经过webpack处理的文件输出的地方
                 path:要输出文件的路径,当前工作目录下的public文件夹。
                 filename:输出文件的名字,我们为了把打包出来的js文件和HTML文件能区分开所以在filename加了一层路径js,文件名称定为bundle.js。
        module:模块,各种资源加载器都是在这里进行配置。
           rules:一组规则,与创建模块时的请求匹配。这些规则可以改变模块的创建方式。也可以将加载器应用于模块,或修改解析器。我们就是要在这里去用们安装的那些依赖包各种解析器。
               test:匹配规则,找到所有符合这个规则的文件。一般是一个正则表达式!
               use:指定对符合匹配规则的文件使用何种解析器。他可以是一个对象也可以是个数组,当处理该类型的文件需要用到多个解析器的时候就可以用数组,比如解析.scss文件时。
               loader:指定的解析器;解析器的名字字符串形式。
               exclude:指定那些不需要解析器处理的文件。忽略node_modules下的文件。

        最后我们把模板插件以及处理css和scss文件的解析器也配置好,最终的webpack.config.js文件如下

var htmlWebpackPlugin = require('html-webpack-plugin');// 引入我们安装的HTML模板插件
const path = require('path');
module.exports = {
context: path.resolve('./src'),
devtool: 'eval-source-map',
entry: __dirname + '/src/study/main.js',
output: {
    path: __dirname + "/public",
    filename: "js/bundle.js"
},
devServer: {
    contentBase: './public',
    historyApiFallback: true,
    inline: true // 实时刷新
},
module: {
    rules: [
        {
            test: /(\.jsx|\.js)$/,
            use: {
                loader: "babel-loader",
            },
            exclude: /node_modules/
        },
        {
            test:/\.css$/,
            use:['style-loader','css-loader','postcss-loader','sass-loader']
        },
        {
            test:/\.scss$/,
            use:['style-loader','css-loader','postcss-loader','sass-loader']
        },
    ]
},
plugins:[
    new htmlWebpackPlugin({
        template:'index.html'
    })
]
}

devtool:一个开发辅助工具,加载webpack编译的源文件。有了它可以在浏览器调试代码时看到源文件。

devtool工具作用

devServer:实时动态刷新页面,每当你修改了页面代码都会出发刷新,这样不就不用每次都执行一次webpack编译然后自己手动刷新浏览器看结果了。
plugins:所用到的插件都在这里进行初始化,具体插件怎么用,跟webpack一样,去官网查各种配置属性。
HTMLwebpackplugin用来生成一个HTML文件,可以给他指定一个默认的模板,template属性指定使用的模板。它还有很多其他配置属性,点开文档,找到Option有个表格列出了所有的属性和作用。

4.编写.babelrc文件和.postcssrc.js文件

 // .babelrc 文件内容,stage-0注意一定要放在后面,更好的支持ES6、7属性。
{
"presets":["es2015","react","env","stage-0"]
}

.postcssrc.js文件内容

module.exports = {
plugins:{
    "autoprefixer": {}
}
}

5.在package.json配置webpack命令

配置webpack的命令主要在package.json文件中的script属性中,如下:

"scripts": {
"build": "webpack",
"start": "webpack-dev-server --open",
"dev": "webpack-dev-server --open --config webpack.dev.config.js --mode development"
},

这里的重点在于后面的值,前面的属性名可以随意命名,且可以配置多个。
"webpack-dev-server --open":使用webpack编译并打开webpack server就是刚才我们配置的DevServer。
"--config":"指定webpack使用哪一个配置文件",
"--mode development":当前运行环境为开发模式
// 下面的是其他打包时的命令属性,可以添加进去试试。

"--progress":"打包过程",
"--display-modules":"打包模块",
"--colors":"打包颜色",
"--display-reason":"打包原因"

注意:dev那个命令配置我们是还没有写webpack.dev.config.js文件的,所以这个先自动忽略。

6.测试一下配置好的工程环境

准备了这么多,终于可以验证一下了。
创建一个test.js文件在study文件夹下,然后main.js修改如下

// test.js文件
import React,{ Component } from 'react';
import '../style/main.scss';// 引入scss
class Test extends Component{
constructor(props){
    super(props);
}

render(){

    return(
        <div>
            <h1>Hello React!</h1>
        </div>
    )
}
}
export default Test;

main.js文件

import React from 'react';
import { render } from 'react-dom';
import Test from './test';// 引入上面的test组件

render(<Test />,document.body);

style文件下创建一个main.scss文件

.mainStyle{
.titleColor{
color: chocolate;
}
}

ok,一切准备就绪。激动人心的时刻到了。
在命令行中执行命令

npm start // 回车

最终效果:


测试效果

        可以去改动test.js文件中的文字,在看浏览器,不用手动刷新,会自动刷新的。同时看看我们的devtool是不是也起到作用了:


mapsource

        万事开头难,到这我们已经把最难得一块搞定了。

        还是得提一下,react是有脚手架的:create-react-app.可以一键生成应用我们上面所配置的东西它都帮你搞定了,有兴趣的可以试试。但还是建议能了解这个构建过程。

本工程的源码地址:点击源码.
注意 看radme.md文件说明。且下一章的ES6小补源码也在这个源码中test.js文件

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

推荐阅读更多精彩内容

  • 1 Webpack 1.1 概念简介 1.1.1 WebPack是什么 1、一个打包工具 2、一个模块加载工具 3...
    Kevin_Junbaozi阅读 6,617评论 0 16
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 11,018评论 0 21
  • 写在前面的话 阅读本文之前,先看下面这个webpack的配置文件,如果每一项你都懂,那本文能带给你的收获也许就比较...
    不忘初心_9a16阅读 3,227评论 0 17
  • 美乐爱觉日精进打卡372天 哈哈,最近几天比较轻松,在天津看看电影,处理我们和爸妈的业,感觉天都快塌了,突然发现 ...
    曾小杰爱码字阅读 440评论 0 0
  • 最近读了一本书,《舍弃》, 臼井由妃的作品,书中提到成功人士都有一个大号垃圾桶,清理自己的多余物品,延伸清理自己的...
    leoliwinner阅读 322评论 0 0