美文网首页
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