其他分享
首页 > 其他分享> > 【Vue学习笔记】一、前端工程化与Webpack

【Vue学习笔记】一、前端工程化与Webpack

作者:互联网

【Vue学习笔记】一、前端工程化与Webpack

一、前端工程化与Webpack

注意:该部分内容仅需了解原理,不需要特别记忆

1)前端工程化

2)webpack

概念:webpack是前端项目工程化的具体解决方案

主要功能:它提供了友好的前端模块化开发支持,以及代码压缩混淆、处理浏览器端JavaScript的兼容性、性能优化等强大的功能

插件在https://npmjs.com中查阅文档

3)webpack的基本使用

1.创建列表隔行变色项目

image-20220319182041038

2.在项目中配置webpack
  1. 在项目根目录中,创建名为webpack.config.js的webpack配置文件,并初始化如下的基本配置
module.exports = {
	mode: 'development' //mode用来指定构建模式,可选值有development和production
    //如果是production,则会进行代码压缩
}
  1. 在package.json的scripts节点下,新增dev脚本如下:
"scripts": {
    "dev": "webpack" //script节点下的脚本,可以通过npm run执行,例如npm run dev
}

dev可以任意命名,是npm run xxx的名字

3.在终端中运行npm run dev执行打包,然后会在dist文件夹下生成main.js,在Index.html中导入该js即可

image-20220319184623642

##### 3.指定webpack的entry和output

在webpack 4.x和5.x的版本中,有如下的默认约定:

①默认的打包入口文件为src -> index.js

②默认的输出文件路径为dist -> main.js

在webpack.config.js配置文件中,通过entry节点指定打包的入口,通过output节点指定打包的出口

const path = require('path') //导入node.js中专门操作路径的模块

module.exports = {
    entry: path.join(__dirname, './src/index.js'), //打包入口文件的路径
    output:{
        path: path.join(__dirname, './dist'). //输出文件的存放路径
        filename: 'bundle.js' //输出文件的名称
    }
}
4.webpack中的插件

最常用的webpack插件有如下两个:

①webpack-dev-server

②html-webpack-plugin

①配置webpack-dev-server

修改package.json -> scripts中的dev命令,在webpack后面加上serve

"scripts":{
    "dev": "webpack serve"
}

再次执行npm run dev,重新打包项目,可以打开localhost:8080,查看自动打包效果

②解决Cannot GET /问题

module.exports = {
	mode: 'development', //mode用来指定构建模式,可选值有development和production
    //加入下面这段告知 webpack-dev-server,将 './' 目录下的文件 serve 到 localhost:8080 下(寄存到服务器下)
	devServer: {
		static: "./"
	}
}
③配置html-webpack-plugin

因为每次打开http://localhost:8080是一个文件目录而非index.html,所以可以借助html-webpack-plugin把src里的index.html复制到sreve下(内存里)

//1.导入HTML插件,得到一个构造函数
const HtmlPlugin = require('html-webpack-plugin')

//2.创建HTML插件的实例对象
const htmlPlugin = new HtmlPlugin({
    template: './src/index.html', //指定源文件的存放路径
    filename: './index.html', //指定生成的文件的存放路径
})

module.exports = {
    mode:'development',
    plugins: [htmlPlugin], //3.通过plugins节点,使htmlPlugin生效
}

该插件除了可以复制页面,还会自动注入内存里的webpack打包js

④devServer节点

在webpack.config.js文件中,可以新增一个devServer节点,自动打开运行的服务器地址

module.exports = {
	mode: 'development', 
	devServer: {
		static: "./"
	},
	plugins: [htmlPlugin],
    devServer:{
        open: true, //首次打包成功后,自动打开
        port: 8081, //
        host: '127.0.0.1' //指定运行的地址
    }
}
⑤loder

非.js后缀结尾的模块,webpack默认处理不了,需要调用loader加载器才可以正常打包,否则会报错

loader加载器的作用:协助webpack打包处理特定的文件模块,比如:

导入css

在webpack中,一切皆模块,index.js是webpack的入口,一切导入都在此进行

//导入样式
import './css/index.css'

直接run服务器,会发现报错提示没有合适的loader

image-20220319201429493

安装loader:

npm i style-loader css-loader -D

然后在webpack.config.js的module -> rules数组中,添加loader规则如下:

module: {
    rules: [ //文件后缀名的匹配规则
        {test: /\.css$/, use: ['style-loader', 'css-loader']}
    ]
}

导入less

配置一个index.less

html, body, ul{
    margin: 0;
    padding: 0;
    li{
        line-height: 30px;
        padding-left: 30px;
        font-size:12px;
    }
}

直接运行会与前面css一样的问题,所以也需要装loader

npm i less-loader less -D

添加规则

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

导入图片

导入图片的过程类似

npm i url-loader file0loader
module:{
    rules: [
        {test: /\.jpg|png|gif$/, use: 'url-loader?limit=22229'}, 
    ]
}

高级语法的Loader

js中比如装饰器一类的高级语法webapack无法直接打包,所以也需要loader

npm i babel-loader babel/core @babel/plugin-proposal-decorators -D
module:{
    rules: [
        {test: /\.js$/, use: 'babel-loader', exclude: /node_modules/}, 
    ]
}

注意node_modules里的不用转换,所以要包含exclude: /node_modules/

具体哪些语法要装哪些loader可以在https://babeljs.io查阅

5.发布

把所有页面打包好发给后端,让后端来部署上线

在pakage.json文件的scripts节点下,新增build命令如下:

"scripts":{
    "dev": "webpack serve", //开发环境中,进行dev命令
    "build": "webpack --mode production" //项目发布时,运行build命令
}

–model是一个参数项,用来指定webpack的运行模式,production代表生产环境,进行代码压缩和性能优化

**注意:**通过–mode方法运行的webpack,会覆盖掉module.export里的mode选项

运行后打包好的文件就在dist里

然而打包出来的文件会很乱,所以需要进一步处理

image-20220319205505698

①把JavaScrip文件统一生产到js目录中

在webpack.config.js配置文件里的output节点中配置

output:{
    path: path.join(__dirname, 'dist'),
        //明确告诉webpack把生成的bundle.js文件存放到dis目录下的js子目录里
    filename: 'js/bundle.js'
}
②把图片放到images里

在配置loader的use里用&多加一段参数outputPath=images

module:{
    rules: [
        {test: /\.jpg|png|gif$/, use: 'url-loader?limit=22229&outputPath=images'}, 
    ]
}
③每次发布自动删掉dist文件夹

安装clean-webpack-plugin插件

const { CleanWebpackPlugin } = require('clean-webpack-plugin')
module.exports = {
    plugins:[htmlPlugin, new CleanWebpackPlugin()]
}

4)SourceMap

Source Map就是一个信息文件,里面存储着位置信息,SourceMap文件中存储着压缩混淆后的代码,所对应的转换前的位置

有了它,出错的时候,出错工具将直接显示原始代码,而不是转换后的代码,能够极大的方便后期的调试

在webpack.config.js中添加如下配置即可

module.exports = {
    devtool: 'eval-source-map',
}

这个做法会暴露源码,直接点击报错信息可以直接定位到源码位置

如果指向定位报错的具体行数,且不想暴露源码,可以将devtool设置为nosources-source-map

module.exports = {
    devtool: 'nosources-source-map',
}

image-20220319211725952

1.使用@表示src源码目录

在导入模块时,可以使用@表示src目录,从外往里找,不要使用…/,在webpack.config.js里配置

resolve:{
    alias:{
        '@': path.join(__dirname,'./src/')
    }
}

标签:Vue,webpack,dev,loader,Webpack,module,工程化,js,打包
来源: https://blog.csdn.net/Quindrich/article/details/123610306