美文网首页
自动化打包工具 webpack 1

自动化打包工具 webpack 1

作者: squidbrother | 来源:发表于2019-08-22 01:20 被阅读0次
概述

webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)

安装webpack 核心库
全局安装

npm install webpack -g

针对项目目录,局部安装,添加到依赖

npm install webpack -D
关于模式

--save -d 等同于 -D
代表生产依赖(会被注入package.json中的devDependencies里面),无需要打入最终包

--save 等同于 -S
代表开发依赖(会被注入package.json中的dependencies里面),需要被一起打包

【注】:
局部安装package.json中name不能为webapck,否则报错


webpack名称冲突

查看webpack版本

webpack -v

如果碰到报错情况,因为这是调用指令,需要cli脚手架,需要单独安装,会提示


脚手架没安装

输入 yes 回车,即可安装
或者输入no,退出进行单独安装,

单独 全局安装webpack-cli 脚手架

npm install webpack-cli -g

查看webpack-cli版本

webpack-cli -v
常用功能:

1.通过打包工具,我们可以使得浏览器支持模块化语法
2.图片压缩
3.样式兼容,ES6兼容
4.热更新

//------------------------例:

  • 单入口 ( 一个js输出结果 )
    index.html
<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>webpack打包</title>
    </head>
    <body>
        <div class="main">
            <div class="box" id="btn1">点击我</div>
        </div>
    </body>
    <script type="text/javascript" src="build/bundle.min.js"></script>
</html>

./src/js/index.js

import son from './son/common.js'
son();

var oBtn = document.getElementById('btn1');
oBtn.onclick = function(){
    var _tar = this;
    if(!oBtn.hasClick){
        _tar.innerHTML = '我被点击了'
        _tar.hasClick = true;
        _tar.style.backgroundColor = '#ff0';
    }else{
        _tar.innerHTML = '再来点击我'
        _tar.hasClick = false;
        _tar.style.backgroundColor = '#f60';
    }
}

./src/js/son/common.js

module.exports = ()=>{
    var num = 0;
    document.onclick = function(ev){
        var oEv = ev || window.event;
        num++;
        document.title = num;
        oEv.cancelBubble = true;
    }

}

./webpack.config.js

let path = require('path');
module.exports={
    mode:'development',
    entry:['./src/js/index.js'],
    output:{
        path:path.resolve(__dirname,'build'),
        filename:'bundle.min.js'
    }
}

./src/css/common.css

body,html { margin:0;} 
.main { width: 640px; margin: 0 auto; 
transform: skew(25deg);
}
.box { width: 100px; height: 100px; margin:100px auto 0; background: #f60; line-height: 100px; text-align: center; font-size:14px; }
body { background:url(../img/111.jpg) no-repeat 0 0; }

针对多个js文件的打包,输出多个文件的情况

  • 多入口 ( 多个js输出结果 )
    ./webpack.config.js
let path = require('path');
module.exports={
    mode:'development',
    entry:{
        index:'./src/js/index.js',
        common:'./src/js/son/common.js'
    },
    output:{
        path:path.resolve(__dirname,'build'),
        filename:'[name].min.js'
    }
}

打包结果:

build/index.min.js
build/common.min.js

//---------------------------------------以上的打包都是针对JS文件

loader工具的使用

loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。
loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块
然后你就可以利用 webpack 的打包能力,对它们进行处理。

兼容ES6

安装:

npm install babel-loader @babel/core @babel/preset-env -D

语法格式:

rules:[ 
    {
        test:/\.jsx?/i,
        exclude:/node_modules/,  //如果引入了node_modules中的包,不要编译
        use:{
            loader:'babel-loader',
            options:{
                presets:['@babel/preset-env']
            }
        }
    }
]

查看JS压缩前报错位置

无需安装,在entry,mode,output,module同级加一个devtool即可
谷歌浏览器,火狐浏览器均可(gulp的sourcemap 在火狐下不好用)

devtool:'source-map'
报错位置
js压缩 (生产模式下有效)

安装:

npm install uglifyjs-webpack-plugin -D

使用:

...
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
...
optimization: {
    minimizer: [
        new UglifyJsPlugin({
          test: /\.jsx?$/i
        })
    ],
}
...

注意事项:uglifyjs-webpack-plugin需要babel模块支持

css2.0文件打包

安装:

npm install style-loader css-loader -D

语法:

module:{
    rules:[
        { test:/\.css$/, use:['style-loader','css-loader']}
    ]
}

值得注意的是:依赖包存在先后的执行顺序:
css-loader : 加载CSS文件
style-loader : 将css内容输出到页面

打包后,css外链样式会被读取,然后通过JS语言插入到html页面中,如图:


将引入的css模块插入到页面

上面的操作是针对css2.0的情况,如果对css3应该怎么处理呢

css3.0 兼容

安装:

npm install postcss-loader autoprefixer -D

同级目录增加 postcss.config.js
作为css3的打包规则文件
值得注意 postcss.config.js 中可以根据浏览器的使用比例,增加兼容前缀数量 (如webkit、ms、moz、o等)

module.exports={
    plugins:[
        require('autoprefixer')
    ]
}

语法格式:

module:{
    rules:[
        { test:/\.css$/, use:['style-loader','css-loader','postcss-loader']}
    ]
}   

【注】:
再次注意执行顺序 'style-loader','css-loader','postcss-loader' 自右至左
postcss-loader :兼容处理css3
css-loader:读取文件
style-loader:将样式插入到页面

针对富媒体的处理

安装:

npm install file-loader -D

语法格式:

module:{
    rules:[
                  {
                        test:/\.(jpg|png|gif)$/i,
                        use:{
                loader:'file-loader',
                options:{
                        outputPath:'images/'   //指定图片输出路径
                             }
                    }
            }
    ]
}
富媒体打包
针对碎片化图片

如果要对体积很小的图片打包,可以将其处理成base64
安装:

cnpm install url-loader -D

【注】:url-loader不能单独使用,其内部依赖模块file-loader

语法格式:

module:{
    rules:[
        {test:/\.(jpg|png|gif)$/i,use:{
                loader:'url-loader',
                options:{
                    outputPath:'image/',
                    limit:10*1024   //单位字节,例:10kb    -- 一般32
                }
            }
        }
    ]
}

将大于10kb的处理为图片,小于10kb的处理为base64


特殊处理
针对预编译less

安装:

npm install less-loader less -D

语法格式:

module:{
    rules:[
        { test:/\.less$/i, use:['style-loader','css-loader','less-loader']}
    ]
}
eslint

校验代码格式
安装:

npm install eslint eslint-loader -D

语法格式:

rules:[
  {
    test:/\.js$/i,
    loader:'eslint-loader',
    exclude:/node_modules/,  //排除依赖库
    options:{
    }
  }
]

添加eslint配置文件 .eslintrc

{
    "parserOptions": {
        "ecmaVersion": 6,   //版本
        "sourceType": "module", //资源:模块
        "ecmaFeatures": {
            "jsx": true //兼容jsx
        }
    },
    "rules": {
        "indent":["error",2], //缩进2个空格
        "linebreak-style":["error","windows"],  //换行风格
        "quotes":["error","double"],    //单双引号
        "semi": ["error","always"]  //结尾分号
    }
}
报错信息

eslint 官网参考 配置原则

//-------------------------- 单元测试

jest

安装

npm install jest jest-webpack -D

语法格式:
在项目根下,新增tests文件夹,内部增加测试JS文件
引入被测试模块

test('任务名',()=>{
    expect(cbfn.addfn(1,2)).toBe(3);  //cbfn.addfn(1,2)是被测试模块的方法
})

expect(测试语法).toBe(预期值);

单元始终没有跑通
报错

Error: Cannot find module 'webpack/bin/config-yargs

查询可能是webpack与webpack-dev-server版本有冲突造成
删除原包,降级成了网友的版本

"webpack": "^4.8.3",
 "webpack-cli": "^2.1.3",
"webpack-dev-server": "^3.1.4"

继续报错,错误变为“:

Error: Cannot find module 'jest-cli/build/SearchSource'

安装了jest-cli 然而问题依然存在.......

//-------------------------- 热更新
dev-server
安装:

npm install webpack webpack-cli webpack-dev-server -D

热更新服务器启动必须要依靠webpack-cli的指令:
2-1:定义指令


定义指令

2-2:启动指令(针对上图)

npm run web

访问:
访问地址会显示在终端命令中,如:http://localhost:8080/
打开浏览器访问你的页面

http://localhost:8080/index.html

值得注意的是,热更新针对打包文件的修改,为了提高性能,并不会真正改变磁盘中的文件,而是在内存中生效
另外打包后的文件路径需要修改

针对本例:
根下的 index.html引入js地址:
build/bundle.min.js 改为 bundle.min.js
只要这个路径修改了,其内部css,img,js等会自动对应,不用调整路径;
感觉像是在服务器根下,镜像了一个bundle.min.js,挂载缓存中

另外,调试完毕后,记得再次webpack下,将文件真正修改到磁盘中的文件内

相关文章

  • webpack3

    前端自动化打包工具1、安装 webpack 此文档使用webpack版本为 3.4.1,在你自行测试中,可能输出结...

  • vue+node环境搭建

    · webpack:代码模块化构建打包工具· gulp: 基于流的自动化构建工具· grunt: Javascri...

  • webpack简单使用

    一、webpack简介 1.webpack是什么 webpack项目打包工具,项目构建工具 2.webpack有什...

  • 3 webpack自动化构建工具

    1、自动化构建工具 ->构建打包,使开发者更专注于“开发” ->常用webpack、Gulp、Fis3(百度); ...

  • 前端构建工具&&前端模块化工具&&前端架构工具&&前端类库

    前端自动化构建工具 webpack 是一个打包模块化的js的工具,在webpack里一切文件都是模块,通过load...

  • webpack初始(1)

    1. 简介 webpack(模块打包工具):webpack是一个打包模块化的Javascript的工具,它会 从入...

  • 002手动配置webpack的记录

    与webpack有类似功能的工具grunt/gulp1webpack 是什么?打包工具(WebPack可以看做是模...

  • webpack

    概念 ==> webpack 是什么?? 前端模块化打包(构建)工具 webpack 的两个方面 1.打包 ...

  • webpack基础知识.

    webpack是什么? webpack是一个模块打包工具,他的存在使前端工程化,自动化变为可能. 基本常识 使用前...

  • 自动化打包工具 webpack 1

    概述 webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler) ...

网友评论

      本文标题:自动化打包工具 webpack 1

      本文链接:https://www.haomeiwen.com/subject/xjawsctx.html