最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • webpack 简析

    正文概述 掘金(call_me_dan)   2021-06-13   603

    webpack可以做的事:

    • 处理各种资源,css、js、html、图片等
    • 代码转换、文件优化、代码分割、模块合并、自动刷新、代码校验、自动发布

    1. 基本使用

    1.安装

    这里使用webpack4版本

    npm install --save-dev webpack webpack-cli
    

    2. 0配置

    默认入口是 src 下的 index.js , 出口是 dist 下的main.js

    webpack4版本默然打包的是生成环境 production 打包之后文件都是已经压缩

    // 运行
    npx webpack
    

    3. 手动配置

    默认配置文件的名字 webpack.config.js, webpack 是用node写的,所以配置文件要用node的模块化语法

    module.exports = {
        entry: './src/index.js',
        output: {
            filename: 'build.js', //'打包后模块名称'
            path: path.resolve(__dirname, 'dist'), //'打包后路径,要用绝对路径'
            publicPath: ''
        },
        mode: development, //模式默认两种,一个是生成环境production ,一个是测试环境development
    }
    

    1. 入口出口

    • entry 入口文件 这里是单文件,就是项目的入口
    • output 出口文件的配置,包括名字,输入位置,publicPath(打包文件添加的路径,一般是域名来做CDN)

    2. resolve webpack启动后会从配置入口模块查找依赖模块,Resolve配置就是告诉webpack如何查找模块对应文件

    • alias
      这个属性非常常用,用来定义别名,在使用的时候可以不用引入特别长的路径,比如
      如果页面中引入 components开头,就是去 'src/components'路径查找

      import button from 'components/button'
      import button from '/src/components/button'
      
      resolve: {
          alias: {
              'components': '/src/components'
          }}
      
    • extensions 
      项目中为了写法简洁引入文件时候经常不加后缀,这个时候webpack会自动加上后缀检查文件是否存在

      import button from 'components/button' // 这里就省略了 .vue扩展
      
      extensions: ['.js', '.vue', '.json'] // 依次按照js, vue, json 添加尾缀然后查找文件
      
    • modules
      modules 会告诉webpack去哪些目录下面查找第三方模块,默认是去node_modules目录下面去找,我一般还会配置上自己的模块库

      modules: ['./src/components', 'node_modules']
      
    • mainFields
      有的文件会根据不同环境提供几份代码,比如分别提供了 ES5 和 ES6两份代码,入口都写在库文件的package.json中

      {
          "next: main": 'es/index.js', // ES6
          "main": 'lib/index.js' // ES5
      }
      

      比如我们想先加载ES6,就要要这样配置

      mainFields: ["next: main", "main"]
      

    4. 自定义config文件名

    通过config 参数确定配置文件位置

    //运行
    npx webpack --config webpack.config.test.js // 
    

    或者直接配置到package.json中

    scripts: {
        'build': 'webpack --config webpack.config.test.js'
    }
    

    运行

    npm run build
    

    2. webpack-dev-server web服务器

    1. 安装 

    npm install --save-dev webpack-dev-server
    

    2. 启动dev-server

    npx webpack-dev-server
    

    3. 8080端口静态服务器

    但是静态目录不是我们需要的,我们需要的是启动一个把文件打包到内存中的本地服务器

    4. devServer配置

    {
        devServer: {
            host: '127.0.0.1',
            port: 9999,
            contentBase: './build'
        }
    }
    

    其中 contentBase 是服务的的目录位置,host,不配置默认是localhost ,但是不能启动成功,只有配置成 127.0.0.1 才能成功, 服务启动后就会找到 contentBase下面的html 文件

    5. 代理

    本地启动一个3000的web服务,但是接口在另一台服务器上 比如 4000端口,这个时候就要把接口代理到接口服务器上

    devServer: {
        proxy: {
            '/api/': 'http://localhost:4000'
        }
    }
    

    上面配置的意思是,只要3000端口访问带 api的资源都会代理到 4000端口上去

    3. 常用plugin 

    1.html-webpack-plugin

    可以将一个模板拷贝到打包后的目录,并把打包后的js插入到模板中,这样的话就不用受到添加html文件了

    plugins: [
        new HtmlWebpackPlugin({
            template: '模板文件路径',
            filename: '生成的文件名称'
        })
    ]
    

    还可以压缩生成的html

    new HtmlWebpackPlugin({
        minify: {
            collapseWhitespace: true, // 去掉空格
        }
    })
    

    2. clean-webpack-plugin

    主要用途就是将打包后的目标文件先删除,然后再打包,

    let { CleanWebpackPlugin } = require('clean-webpack-plugin')
    new CleanWebpackPlugin({
        root: path.resolve(__dirname, 'build')
    })
    

    3. copy-webpack-plugin

    主要用途会把一些静态资源复制到打包好的目录中

    let CopyWebpackPlugin = require('copy-webpack-plugin')
    new CopyWebpackPlugin([
        {
            from: '静态文件目录',
            to: '打包后的目录'
        }
    ])
    

    4. DefinePlugin

    这是webpack 自带的插件,用来定义变量,主要用来区分 生产环境和 dev环境

    new webpack.DefinePlugin({
        "process.env": {
            'NODE_ENV': 'development' // 这的赋值可以是development 或者 production
        }
    })
    

    页面中使用, 直接使用 process.env来区分环境

    process.env.NODE_ENV == 'development'
    

    4.常用loader

    下面我们针对页面中这些资源  CSS, JS, 全局变量,文件 看看哪些loader可以处理以上资源

    1. css-loader

    css-loader 是用来解析@import 和 url的,当我们在index.js 中引入一个css文件

    // index.js
    import css from './style.css'
    console.log(css)
    
    // style.css
    body{
        background: red;
    }
    

    webpack 中loader 配置, 所有的loader 规则写在module 对象的 rules 里面,rules对象是个数组,接收多个规则,规则解析从后向前

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

    启动dev-server服务看到 index.js 中的 css解析出来是一个数组,第一个元素是 路径和解析出来的样式字符串

    webpack 简析

    css-loader只会把css模块加载到JS代码中

    2. style-loader

    这样就解析了css 但是这个时候页面还没生效,也就是说没有把解析好的css 插入到页面中,这个时候就需要style-loader, style-loader 会把 css-loader生成的数组样式,解析后生成style 标签插入到head 中,这样样式就生效了

    修改一下上面css-loader 代码, rules 中  use 是个数组,元素可以是对象,也可以是字符串loader名称 如: use: ['style-loader', 'css-loader'], 规则都是从右向左

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

    这个时候页面中head 中就有了 样式了

    webpack 简析

    3. less-loader

    主要作用是将less 语法转换成css语法, 需要安装less-loader 和 less 模块 ,less-loader会调用less的render方法,后面手写的时候会提到

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

    4. postcss-loader

    以前浏览器兼容,会对不同浏览器加不同前缀,这就导致写了若干兼容代码

    postcss 是什么:我们可以理解它为css的编译工具,类似于babel对js的处理,他提供CSS解析器,将CSS解析成抽象语法数(AST),虽然本身对CSS不会处理什么,但是通过插件就可以实现对CSS的操作,

    常用的 autoprefixer,  实现css3代码自动补全

    postcss-loader用法, 这里注意postcss 已经要放到 css 之前处理(从右到左)

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

    这里还要添加一个 postcss.config.js

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

    这样对元素添加一个 transform: rotate(45deg), 就看到了添加的前缀

    webpack 简析

    5. babel-loader

    上面介绍了一些处理css的loader ,这里说下处理js的loader, 一般都是将高级别的语法转换成浏览器能识别的ES5语法, 这里babel本身不转义代码,如果没有插件,babel处理之后代码不会有变化

    安装 

    这里需要安装 babel-loader @babel/core( 转换成语法数) @babel/preset-env(可以看做是babel的插件,转义的语法规则)

    module: {
        rules: [
            { test: /\.js$/, loader: 'babel-loader'}
        ]
    }
    

    所有要添加引入的插件文件 .babelrc, 这里的转义规则可以根据需要自行配置,

    我常用的就是stage-2, 

    还有一些插件 transform-runtime 等(generator语法),

    还有一些实例的方法不能使用 比如数组 includes 方法 可以用babel-polyfill

    {
        persets: ['@babel/preset-env']}
    

    6. expose-loader

    为了解决一些插件不支持CommonJs引入问题,比如 bootstrap.js,只能jquery 暴露全局变量才可以用,所有会有需求把第三方库暴露成全局变量

    首先webpack 配置, 这里要注意,不用版本写法不同,支持的webpack也不同

    rules: {
        test: require.resolve('jquery'),
        loader: 'expose-loader',
        exposes: ['$', 'jQuery']
    }
    

    然后文件中使用require才会生效, 这个时候$和 jQuery 会挂载到window下面

    require('jquery')
    

    1另外还有一些其他方法可以暴露全局变量,webpack的 externals 属性,webpack的ProvidePlugin插件, 可以直接将jquery暴露到全局变量中,不需要再require引入了

    7. file-loader

    主要处理一些引入的资源,图片,字体,图标等, 将处理的图片打包到对应的目录下面

    rules: [
        { test: /\.(png|jpg\gif)$/, loader: 'file-loader' }
    ]
    

    这个时候看打包好的文件目录就会有一个名字为hash码前缀的图片资源

    8. url-loader

    这个也是处理项目中引入的图片等资源,与 file-loader不同的是,一般处理小尺寸的图片,直接生成base64,这样页面就不用再请求图片资源了,直接加载出来图片,但是base 64 一般比打包前的图片大, 一般会做配置 limit 超过多少k的图片就 用file-loader 打包,小于就用url-loader生成base 64

    rules: [
        { test: /\.(png|jpg|gif)$/, loader: 'url-loader', options: {
            limit: 200 * 1024
        }}
    ]
    

    5.Source Map

    当正式环境打包后,会压缩代码,可能代码就会一行显示,当代码中报出错误,由于一行显示代码不能找到错误的具体位置,source map就是做了映射,更有利于调试

    module.exports = {
        devtool: '配置项'
    }
    

    下面是不同配置项对应的结果

    1. source-map: 源码映射,功能最全,打包速度会变慢, 会单独生成一个.map 文件
    2. eval-source-map:  直接在源码中写入source-map,不影响构建速度,单影响执行速度
    3. cheap-module-source-map: 会产生一个不带映射的单独的map文件,开发中工具可以看到,看是不能对应到对应的列
    4. cheap-module-eval-source-map: 不单独生成map文件,但是开发者工具可以看到行,不能对应的列

    6.结束

    本篇主要简单介绍了webpack 一些常用的插件和 用法,后续还有优化和手写loader和plugin以及源码的实现的文章,不温不火更新中....,欢迎关注


    起源地下载网 » webpack 简析

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元