Webpack,打包工具使用

安装:基于nodejs下面安装

node.js说明:安装node会自动安装npm包,可以前往淘宝镜像官网查看安装命令,安装在全局,
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
命令:npm install webpack -g或者 npm install webpack -g --registry=https://registry.npm.taobao.org

webpack 简介

一款模块加载器兼打包工具
支持AMD/CMD写法
处理依赖关系,然后解析出模块之间的依赖,将代码打包
把各种资源,都作为模块来使用和处理。
比如 js css Less Sass等。。。

http://webpack.github.io/

安装后就在命令行中使用 webpack命令

把依赖写入 package.json

npm install webpack --save-dev
webpack命令
打包命令 webpack entry.js output.js

entry.js 打包的入口文件
output.js 打包后的文件//运行命令后生成的js文件,

例子:导入js文件

入口文件: index.js

var str = require('./app.js');//通过AMD或CMD语法定义依赖资源
document.body.innerHTML = str;

依赖文件: app.js
module.exports = 'hello world';
运行`webpack index.js output.js, `就会将index.js和它的依赖app.js都打包到同一个文件output.js中,所以我们直接调用output.js就好

index.html//里面导入打包好的js文件,

<script src="output.js"></script>

模块加载器(loader)

webpack不只可以打包js, 还可以打包css,图片..等等其他资源, 只是要加载相应的加载器
在本地安装:npm install style-loader 和npm install css-loader;//会安装在 node_modules里面
例子:导入css 或者图片文件
1,在入口文件导入css文件,需要导入加载器
require('style-loader!css-loader!./index.js')

入口文件: app/index.js

//通过AMD或CMD语法定义依赖的css资源
//但是需要额外的加载器来处理css, 这里需要两个加载器style-loader和css-loader
//css-loader是用来处理css文件的, style-loader是用来解析css语法的
//加载器的顺序不能打乱,加载器是从右到左依次执行的

require('style!css!./css/style.css');
var str = require('./app.js');
document.body.innerHTML = str;
这样, 我们就把style.css也打包到ouput.js中,再index.html就不需要导入style.css

index.html

<!-- 猜想: css的导入可能是通过output.js动态生成/ -->
<!-- <link rel="stylesheet" href="app/css/style.css"> -->
<script src="build/build.js"></script>
注意: 加载器需要安装,各种不同文件类型的资源, Webpack 有对应的模块 loader

安装加载器

npm install xxx-loader --save-dev
例如:css-loader style-loader 处理css文件和样式

更多参考

webpack配置文件
配置之后,直接运行 webpack命令跑起来
使用webapck.config.js把所有配置放在一起,
webpack有很多参数,有时我们使用配置文件更方便

webpack配置文件取名为 webapck.config.js, 我们在配置文件的相同路径下运行webpack命令,

就会使用配置文件中的信息作为我们的参数

配置文件说明:

文件名:webpack.config.js

module.exports = {
    entry: './src/index.js', //打包的入口文件  String|Object
    output: { //配置打包结果     Object
        path: './build/', //定义输出文件路径
        filename: 'build.js', //指定打包文件名称
    },
    module: { //定义了对模块的处理逻辑
        loaders: [ //定义了一系列的加载器   Array
            {
                test: /\.css$/, //正则,匹配到的文件名
                //处理匹配到的文件, 这样我们就用js文件写入相应的加载器了
                //直接写require('./css/style.css')
                loaders: ['style-loader', 'css-loader']
            }

        ]
    },
    resolve: {
        //自动补全识别后缀
        //require('./css/style'); 可以不用写后缀名了
        extensions: ['.js', '.css', 'jsx']

    }
}

webpack-dev-server

轻量级的服务器

安装webpack-dev-server

npm install webpack-dev-server -g
安装后在命令行中使用 webpack-dev-server命令启用服务

npm install webpack-dev-server --save-dev
把依赖写入 package.json

自动刷新

如果没有安装在全局中,安装在node_modules里
在根目录下使用命令:..\node_modules\.bin\webpack-dev-server --hot --inline
安装在全局中
使用命令webpack-dev-server --hot --inline做到自动刷新

注意: 使用webpack-dev-server命令生产的打包文件是在内存中,不会真的生成打包文件(build/build.js), 而且路径是在当前路径下, 所以我们应该这么调用

index.html

<!-- 注意不是我们配置文件中build/build.js, 因为并不会真的生成, 而是在内存中, 路径为当前路径下 -->
<script src="build.js"></script>
在webpack.config.js中配置服务

devServer: {  
    //服务器根目录
    contentBase: './build/'
}
注意 : hot和inline这两个比较特殊, 必须在命令行中写入

参考

自动生成html文件

html-webpack-plugin

安装:

npm install html-webpack-plugin --save-dev

使用:

webpack.config.js中引入

var htmlWebpackPlugin = require('html-webpack-plugin');
在plugins中配置:

plugins:[
        new htmlWebpackPlugin({
            title:"首页"
        })
    ]

多个打包文件
webpack.config.js

{
    entry: {
        //键值为模块名
        build: './app/index.js',
        build2: './app/index2.js'
    }
    output:{
        path: './build/',
        name: '[name].js'//将文件名换成[name], 根据定义模块名生成相应的输出(build.js,build2.js)
    } 
}

那我们在生成html的时候就可以指定具体使用哪个模块

plugins:[
        new htmlWebpackPlugin({
            title:"首页",
            chunks: ['build']//生成的HTML,并自动导入生成的js文件
        }),
        new htmlWebpackPlugin({
            title:"build2",
            filename: 'index2.html',//html文件名,不指定默认为index.html
            chunks: ['build2']//指定导入打包后的js文件,可以多个
        })
    ]

babel 转码器

作用: 将ES6代码转为ES5代码

安装babel-cli

npm install babel-cli -g
转换命令:babel app.js --out-file build.js

注意: 直接运行发现,并没有把代码转成es5

还需要在目录下创建.babelrc文件,设置为

preset是预处理的意思

{"presets": ["es2015"]}
并且还需要安装:

npm install --save-dev babel-preset-es2015
webpack+babel

使用webpack将es6转成es5

使用babel-loader

需要安装

npm install babel-loader --save-dev
在webpack.config.js中加入对应的处理

{
test: /.js$/,
loader: 'babel?presets[]=es2015',//传入参数
}
注意在本地也要安装babel-cli

npm install babel-cli --save-dev

webpack+react

首先我们需要安装3个模块

npm install react react-dom babel-preset-react --save-dev

react和react-dom是我们需要的react库, 作为我们需要导入的库文件,

var React = require('react');
var ReactDOM = require('react-dom');
babel-preset-react 是用来转换jsx语法的

在loader中修改为:

{
    test: '/\.js$/',
    //如果没有用es6可以不用加presets[]=es2015预处理
    loader: 'babel?presets[]=es2015&presets[]=react'
}

热加载

如果改变某个组件,不会整体刷新网页,只改变修改的部分

安装 react-hot-loader

npm install react-hot-loader --save-dev

在loader中修改为:

var path = require('path');

{
    test: '/\.js$/',
    loaders: ['react-hot','babel?presets[]=es2015&presets[]=react'],
    include: path.resolve(__dirname, 'react'),
    exclude: '/node_modules/'
}

浏览器调试

1,安装chrome 的插件,react dev tools
2,在配置文件,配置:
devtool: 'source-map'

使用react的基本结构

注意json 数据文件的格式

[{
    "userName": "xxxx",
    "content": "yyyy",
    "id": 1
}, {
    "userName": "ddddd",
    "content": "ccccc",
    "id": 2
}, {
    "userName": "ddddd",
    "content": "ccccc",
    "id": 3
}]

1.入口文件:index.jsx

require('./style.css');//导入css文件
//如果使用bootstrap,需要导入的组件,要先在库里面安装后才能使用
require('bootstrap/dist/css/bootstrap.css');
//导入json数据文件
var data = require('./data.json');

var container=document.querySelector('.container');//获取dom元素
var React=require('react');//导入react库,
var ReactDOM=require('react-dom');//导入react-dom库,才能使用ReactDOM
var MainComponent=require('./MainComponent');//导入定制的组件
//图片路径的添加方式
ImgData.forEach(function(item,i){
    item.imgUrl=require('./img/1.jpg')//给ImgData的每项添加一个imgUrl属性,为图片路径
})

ReactDOM.render(
    <MainComponent/>,
    container
)

2.配置文件webpack.config,js

module.exports = {
    entry: './src/index',
    output: {
        path: './build/',
        filename: 'build.js'
    },
    module: {
        loaders: [{
            test: /\.css$/,
            loaders: ['style-loader', 'css-loader']

        }, {
            test: /\.jsx$/,
            loaders: ['babel-loader?presets[]=es2015&presets[]=react']
        },{
          //导入bootstrap需要配置的文件
        test: /\.(png|jpg|gif|woff|woff2|eot|ttf|svg)$/,
            loaders: 'url-loader?limit=8192'
        }, {//导入json需要配置的信息
            test: /\.json$/,
            loaders: ['json-loader']
        }]
    },
//改变端口号
    devServer:{
        contentBase:'./src',//改变服务器的根目录
        port:4000
},
    //调试工具
    devtool:'source-map',
    resolve: {
        //自动补全识别后缀
        //require('./css/style'); 可以不用写后缀名了
        extensions: ['', '.js', '.css', '.jsx']

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

推荐阅读更多精彩内容