美文网首页
webpack基础上

webpack基础上

作者: wyc0859 | 来源:发表于2019-11-17 02:25 被阅读0次

    安装

    npm init 一路回车
    安装后多了一个package.json文件
    //手动改一下package.json文件
    增加private,表示私有项目
    删除main,既然是私有就不必暴露主js文件了
    修改作者

    {
      "name": "test",
      "version": "1.0.0",
      "description": "",
    "scripts":{
     "dabao": "webpack"  //npm run dabao 不是npx,但这里的npm默认是先项目内
        //该文件不能有注释
    },
      "private":true,   
      "author": "wyc",
      "license": "ISC",
      "devDependencies": {
        "webpack-cli": "^3.3.10"
      },
      "dependencies": {
        "webpack": "^4.41.2"
      }
    }
    

    安装webpack

    由于多版本问题,不建议全局安装,而是项目安装。通过npx运行

    npm install wabpack-cli --save-dev
    npm install webpack --save 
    npx webpack -v  //获取项目内的webpack版本号,而不是全局webpack
    

    配置文件

    不写配置文件,是默认配置,默认的配置文件名webpack.config.js。
    自己写配置文件如下。新建webpack.config.js文件

    const path = require('path'); //引入目录,下面使用
    
    module.exports = {
        //mode:'production',  //无这行,打包时会有警告提示,但并无碍,production打包的代码会压缩
        mode:'development',  //打包的代码不会压缩
        entry: {
            main: './src/index.js'   //入口文件
        },
        output: {    //打包文件
            filename:'bundle.js',  //文件名称
            //path.resolve(__dirname,'dist') 返回绝对路径+'/dist'
            path:path.resolve(__dirname,'dist'),//打包后存放到的当前路径下dist文件夹下
        }
    }
    

    配置文件中已经配置了打包的js主文件,所以npx webpack即可打包,不需要npx webpack index.js了
    不使用默认的配置文件名称,这么打包?npx webpack --config xxxx.js 即可

    三种运行webpack的方式

    webpack index.js
    npx webpack index.js
    npm run xxx
    

    3种方式走的都是webpack指令,如果只安装了webpack,没有安装webpack-cli是不能执行这些指令的

    Loader打包方案

    webpack只能自动识别js文件打包,其他文件格式打包如jpg,pdf,css,vue等,需要安装对应的Loader插件,具体的loader对应,查看https://www.webpackjs.com/loaders/
    如安装sass-loader

    npm install sass-loader node-sass webpack --save-dev
    
    //配置文件中设置jpg的打包方案,使用file-loader来打包
       module:{
          rules:[{
              test:/\.jpg$/,  //打包规则
        //use从下到上,从右到左的顺序
              use:{
                  loader:'file-loader'  //打包方案
              }
          },{
                test: /\.scss$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'sass-loader'
                ]
            }]
        },
    

    打包目录

    src目录下的目录是否需要配置后才能打包?答:不配置,打包后图片存放到dist根目录,配置后存放到dist下指定目录

    index.js文件中引入了imgs目录下的x.jpg,打包后在dist根目录下

    import aimg from './imgs/x.jpg'
    
    var img = new Image();
    img.src = aimg;
    
    var dom = document.getElementById('app');
    dom.append(img);
    

    配置outputPath 打包后指定所有图片统一存放到imgs目录

    rules:[{
                test: /\.(jpg|png|gif)$/,  //打包规则
                use:{
                    loader:'file-loader', //打包方案
                    options:{
                  //打包后的文件名称,不设置为自动hash名称 
                        name:'[name]_[hash].[ext]', 
                        //outputPath: 'imgs/'  //打包后存放的路径
                    }
                }
            }
    

    Plugins 插件

    Plugin 可以在webpack运行到某些时刻的时候做一些事情,类似vue中的生命周期函数

    自动生成html文件,并引入主JS
    htmlwebpackplugin插件会在打包后,自动生成一个html文件,并把打包生成的JS自动引入到这个html文件中。
    安装:npm install html-webpack-plugin -D

    基础用法

    var HtmlWebpackPlugin = require('html-webpack-plugin');
     module:{
            rules:[] 
    },
    plugins: [
      /*  new HtmlWebpackPlugin( )  //不指定模板,也会生成HTML并引入JS,但没有<div id="app"></div>   */
          new HtmlWebpackPlugin({
            template: 'src/index.html'    //按这个模板引入JS后打包
         }) 
    ]
    

    clean-webpack-plugin 删除原打包目录
    不删除原打包目录,继续打包会导致dist目录中存在原有文件并不需要,所以需要先删除dist目录再打包。

    const CleanWebpackPlugin = require('clean-webpack-plugin');
    plugins: [new CleanWebpackPlugin()] 
    新版本CleanWebpackPlugin只接受一个对象作为参数,所以传个数组会报错,如果什么都不传,默认会删除outpub.path目录下的文件
    

    devtool

    devtool 此选项控制是否生成,以及如何生成 source map。
    source map作用:不用source map打包后提示错误是bundle.js的错误,无法调试。用了source map能找到src目录下具体错误的位置。

    source map可设置多种方式
    开发模式推荐:
    方式eval,是执行最快最有效的方式,但不适合复杂情况的处理。
    方式为devtool:‘source-Map‘ ,适用于开发模式,能找到src目录下具体错误的行位置和列位置,dist目录中会多一些map.js
    方式为devtool:‘inline-source-Map‘ ,和上个方式一样,但dist目录中不会多map.js
    方式为cheap的,表示只显示具体错误的行位置,不显示列位置

    生产模式推荐
    生产模式不配置devtool,如果也需要提示,建议:cheap-module-source-map

    devserver ,更新代码页面自动更新,无需再次打包

    devserver分3部
    1、npm run webpack --watch //打包并监听,检测到更新会自动打包,但需手动刷新页面
    2、devserver,启动本地服务器,检测改变自动编译刷新
    webpack-dev-server是一个使用了express的Http服务器,它的作用主要是为了监听资源文件的改变,该http服务器和client使用了websocket通信协议,只要资源文件发生改变,webpack-dev-server就会实时的进行编译。
    3、修改webpack.config,自动打开浏览器
    安装 npm install webpack-dev-server -D

    //修改package.json
    "scripts": {
        "bundle": "webpack",
        "watch": "webpack --watch",    //打包并监听
        "start": "webpack-dev-server",  //打包-启动web服务器。该打包不会有dist目录,而是放在内存中。
        //"server": "node server.js"  //自定义服务器,高阶用法
      },
    
    //修改webpack.config
    devServer: {
            contentBase: './dist',  
            open: true,  //自动打开浏览器
            port: 8080
    },
    执行npm run start  会启动本地服务器,网址http://localhost:8080
    

    如何自定义devserver

    自定义devserver 是非常复杂,非常耗费精力的,以下只是简单描述自定义方式

    //express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架
    const express = require('express');  
    const webpack = require('webpack');  //引入webpack
    const webpackDevMiddleware = require('webpack-dev-middleware');//中间件
    const config = require('./webpack.config.js'); //引用该项目配置文件
    const complier = webpack(config);//webpack使用该配置文件,可随时的进行代码编译,可理解complier为编译器,编译器每执行一次就会重新打包
    
    const app = express();  //express框架实例
    app.use(webpackDevMiddleware(complier, {}));  //框架引入中间件,2个参数(编译器和对象)
    //监听到端口运行app实例
    app.listen(8081, () => {
        console.log('server is running');
    });
    

    更新代码后页面自动更新,但之前操作的页面内容都会不在,怎么保持原页面内容的情况下更新页面呢?
    答:配置Devserver参数hot

    devServer: {
            contentBase: './dist',
            open: true,
            port: 8080,
            hot: true,  //保持并刷新
            hotOnly: true   //如果不能保持并刷新,则不做任何更新
        },
    

    Tree Shaking
    Tree Shaking:没用到的代码不打包,减少打包文件大小

    相关文章

      网友评论

          本文标题:webpack基础上

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