webpack学习笔记

1、一个最简单的webpack项目
在这里插入图片描述

初始化的webpack项目的基本配置:

①webpack.config.js:是webpack默认配置文件

②package.json:主要定义整个项目信息

③package-lock.json:npm install后生成的文件,用以记录当前状态下实际安装的各个npm package的具体来源和版本号

④src:源代码

⑤node_modules:项目依赖包

⑥dist:建构后输出的代码

2、webpack.config.js
webpack在执行时,除在命令行传入参数,还可以通过制定的配置文件来执行。默认会搜索当前目录下webpack.config.js。这个文件是一个node.js模块,返回一个json格式的配置对象,或者通过–config选项来制定配置文件。或者在package.json中的scripts标签内通过webpack的属性值来指定。

webpack是基于node的

//创建webpack.config.js

var webpack = require('webpack');
module.exports = {
    entry:'', //入口文件
    output:{}, // 输出文件
    module:{}, // 模块
	resolve: {}, //其他解决方案配置
    plugins:[], //插件
	devServer: {}, // 开发服务器配置
	mode: 'development' // 模式配置
}

1.入口(entry):
入口指的是webpackage应该使用哪个模块,来作为构建其内部依赖图的开始。默认值为./src

多入口文件:

多入口文件有两种实现方式进行打包:一种是没有关系的但是要打包到一起去的,可以写一个数组,实现多个文件打包;另一种就是每个文件都单独打包成一个文件的。

下面来看看两种方式的写法:

module.exports = {
    // 1.写成数组的方式就可以打出多入口文件,不过这里打包后的文件都合成了一个
    // entry: ['./src/index.js', './src/login.js'],
    // 2.真正实现多入口和多出口需要写成对象的方式
    entry: {
        index: './src/index.js',
        main: './src/main.js'
    },
    output: {
        // 1. filename: 'bundle.js',
        // 2. [name]就可以将出口文件名和入口文件名一一对应
        filename: '[name].js',      // 打包后会生成index.js和main.js文件
        path: path.resolve('dist')
    }
}

2.出口(output)
output属性表示哪里输出它所创建的bundles,以及如何命名这些文件,默认值为./dist

常用属性:

①path:输出路径

②filename:对应entry里面生成出来的文件名

③chunkFilename:按需异步加载的js

3.module:
是对于不同的模块的处理规则。

rules属性代表不同的处理规则。对象的属性有test、use、exclude、include。

①test设置要匹配文件扩展名的正则表达式

②use属性是对象数组,从后往前解析,对象的参数为loader/options。可以简写。

loader是要使用的loader

module:{
  	rules:[
  	{
  		test:/\.css$/,
  		use:[{loader: "style-loader"},{loader: "css-loader"}]
 }]
简写如下:

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

③exclude:包含的文件

④include:包含的目录

下面举几个常用的例子:

<1>引用CSS文件
可以在src/index.js里引入css文件,到时候直接打包到生产目录下

需要下载一些解析css样式的loader

npm i style-loader css-loader -D
// 引入less文件的话,也需要安装对应的loader
npm i less less-loader -D
配置css文件的解析

import './css/style.css';   // 引入css
import './less/style.less'; // 引入less

console.log('这里是打包文件入口-index.js');

// webpack.config.js
module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/,     // 解析css
                use: ['style-loader', 'css-loader'] // 从右向左解析
                /* 
                    也可以这样写,这种方式方便写一些配置参数
                    use: [
                        {loader: 'style-loader'},
                        {loader: 'css-loader'}
                    ]
                */
            }
        ]
    }
}

此时打包后的css文件是以行内样式style的标签写进打包后的html页面中,如果样式很多的话,我们更希望直接用link的方式引入进去,这时候需要把css拆分出来。

extract-text-webpack-plugin插件可以将打包到js里的css文件进行一个拆分

<2>拆分CSS
// @next表示可以支持webpack4版本的插件

npm i extract-text-webpack-plugin@next -D
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
// 拆分css样式的插件
let ExtractTextWebpackPlugin = require('extract-text-webpack-plugin');

module.exports = {
    entry: './src/index.js',
    output: {
        filaneme: 'bundle.js',
        path: path.resolve('dist')
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ExtractTextWebpackPlugin.extract({
                    // 将css用link的方式引入就不再需要style-loader了
                    use: 'css-loader'       
                })
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html',
        }),
        // 拆分后会把css文件放到dist目录下的css/style.css
        new ExtractTextWebpackPlugin('css/style.css')  
    ]
}

此时拆分完css后,打包html页面就以link的方式去引入css

<3>vue-cli中常用loader配置
rules: [
{
test: /.vueKaTeX parse error: Expected 'EOF', got '}' at position 73: …erConfig }̲, { …/,
loader: ‘babel-loader’,
include: [resolve(‘src’), resolve(‘test’)]
},
{
test: /.(png|jpe?g|gif|svg)(?.)?KaTeX parse error: Expected 'EOF', got '}' at position 153: … } }̲, { …/,
loaders: [“style”, “css”, “sass”]
},
{
test: /.(woff2?|eot|ttf|otf)(?.
)?$/,
loader: ‘url-loader’,
query: {
limit: 10000,
name: utils.assetsPath(‘fonts/[name].[hash:7].[ext]’)
}
}
]
}

4.resolve:
webpack在构建包的时候会按目录的进行文件的查找,resolve属性中的extensions数组中用于配置程序可以自行补全哪些文件后缀

还是在此处使用别名。

alias: {
  '@': resolve('src')
}

5.plugins(插件):
插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。

由于插件可以携带参数/选项,必须在webpack配置中,向plugins属性传入new实例。

例如:

文件打包好了,但是我们在使用的时候不能在dist目录下去创建一个html文件,然后去引用打包后的js。这并不合理,实际开发中也不会这样。

这时候需要用到一个常用的插件,html-webpack-plugin,使用插件之前都需要安装插件

然后在webpack.config.js中引用并使用它

let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'bundle.[hash:4].js',   
        path: path.resolve('dist')
    },
    plugins: [
        // 通过new一下这个类来使用插件
        new HtmlWebpackPlugin({
            // 用哪个html作为模板
            // 在src目录下创建一个index.html页面当做模板来用
            template: './src/index.html',
            hash: true, // 会在打包好的bundle.js后面加上hash串
        })
    ]
}

如果是多页面开发的话,就需要配置多页面

let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    // 多页面开发,怎么配置多页面
    entry: {
        index: './src/index.js',
        main: './src/main.js'
    },
    // 出口文件  
    output: {                       
        filename: '[name].js',
        path: path.resolve('dist')
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html',   
            filename: 'index.html',
            chunks: ['index']   // 对应关系,index.js对应的是index.html
        }),
        new HtmlWebpackPlugin({
            template: './src/main.html',
            filename: 'main.html',
            chunks: ['main']   // 对应关系,login.js对应的是main.html
        })
    ]
}

6.devServer
devServe是启动本地静态服务

启动一个静态服务器,默认会自动刷新,当每次对源码文件进行修改并保存后,浏览器会默认刷新一次展现修改后的效果

module.exports = {
    devServer: {
        contentBase: './dist',
        host: 'localhost',      // 默认是localhost
        port: 3000,             // 端口
        open: true,             // 自动打开浏览器
    }
}

在npm run dev命令下,打包的文件存在于内存中,并不会产生在dist目录下

在vue-cli中,在build目录中会有一个dev-server.js的配置文件供我们开启本地服务器,在里面可以做详细配置。这个配置文件是命令npm run dev和npm run start的入口配置文件,主要用于开发环境。

3、package.json文件详细解释
node执行js中require的时候,也会根据package.json中的依赖项查找。

每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息。npm install命令会根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。

最简单的package.json文件,只定义两项元数据:项目名称和项目版本。

{
  "name": "daily-clean",
  "version": "1.0.0",
}

package.json文件就是一个JSON对象,该对象的每一个成员就是当前项目的一项设置。

package.json文件分为必选字段和可选字段

1.必选字段
①name: 项目名称

全部小写,没有空格,可以使用下划线或横线

②version:项目版本号

x.x.x的格式,符合“语义化版本规则”

2.可选字段
①title:标题

②author:作者

“author”: “liuyan liuyan@daojia-inc.com”,

③homepage:项目url主页

④repository:用于指示代码存放的位置

“repository”: {
“type”: “git”,
“url”: “https://github.com/xxx”
}
⑤bugs:问题追踪系统的url或者邮箱地址

⑥devDependencies:指定项目开发所需要的模块

⑦scripts(Object)

key是生命周期事件名,value是在事件点要跑的命令。

scripts指定了运行脚本命令,比如dev指定了运行npm run dev时,所要执行的命令

  "scripts": {
    "dev": "node build/dev-server.js",
    "start": "node build/dev-server.js",
    "build": "node build/build.js",
    "deploy": "node build/deploy.js",
    "sendmiddle": "node build/send-middle",
    "bp": "npm run build && jz",
    "bpprod": "npm run build prod && npm run deploy prod",
    "bpsandbox": "npm run build sandbox && npm run deploy sandbox"
  },

⑧dependencies

指示当前包所依赖的其他包

  "scripts": {
    "dev": "node build/dev-server.js",
    "start": "node build/dev-server.js",
    "build": "node build/build.js",
    "deploy": "node build/deploy.js",
    "sendmiddle": "node build/send-middle",
    "bp": "npm run build && jz",
    "bpprod": "npm run build prod && npm run deploy prod",
    "bpsandbox": "npm run build sandbox && npm run deploy sandbox"
  },

⑦license:授权方式

⑧main:main字段指定了加载的入口文件。这个字段的默认值是模块根目录下面的index.js

⑨config(对象):config对象中的值在scripts的整个周期中皆可用,专门用于给scripts提供配置参数

⑩bin

许多包有一个或多个可执行文件希望被安装到系统路径。在npm下要这么做非常容易(事实上,npm就是这么运行的)。

这需要在你的package.json中提供一个bin字段,它是一个命令名和本地文件名的映射。在安装时,如果是全局安装,npm将会使用符号链接把这些文件链接到prefix/bin,如果是本地安装,会链接到./node_modules/.bin/。

这个字段对应的是一个map,每个元素对应一个{命令: 文件名}

  "bin": {
    "deploy:static": "./bin/deploy_static.js"
  },

⑪engines

engines字段指明了该模块运行的平台,比如node 的某个版本或者浏览器,

既可以指定npm 版本

也可以指定npm 版本

  "engines": {
    "node": ">= 4.0.0",
    "npm": ">= 3.0.0"
  },
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值