webpack配置

webpack

webpack是前端模块化打包工具

  • grunt/glup核心是task,主要核心是前端流程的自动化,模块化不是它的核心;工程模块比较简单没有依赖可以用。

  • webpack加强模块化的开发管理,而不是压缩文件预处理功能,这些只是它的附加功能。需要node环境

一、webpack入门流程

npm init -y                               //初始化生成 package.json 文件

npm i webpack --save-dev                  //安装 webpack,save-dev开发时依赖

npm install webpack webpack-cli webpack-dev-server  -g       //安装 webpack-cli

"private": true,       //调整 package.json 文件,以便确保我们安装包是私有的(private)
    
npm install --save lodash      //打包 lodash 依赖

npx webpack .\src\main.js --output-filename bundle.js --output-path .\dist\ --mode development        //输入main.js文件,输出bundle.js文件,输出路径dist目录下

npx webpack ./src/main.js -o ./dist/bundle.js  //效果基本与上面相同 
webpack  ./src/main.js -o ./dist/bundle.js//表示把模块化的入口文件main.js打包到dist文件bundle.js

二、配置压缩js的结构

webpack.div.js                
 
    var path = require('path')    //node系统模块
 
module.exports = {         
entry: {
   main: './src/main.js'//入口文件
},       
mode: 'development',// 压缩模式
output: {  //输出配置
filename: '[name].js',    //输出名字配置【name】为原来的名字
path: path.resolve(__dirname, '../dist')   //输出的路径
}
},
module: {
  rules:[
    //用来加载loader【loader是用来打包其他文件格式的】
   ]
}
}

三.lodash配置

一、css部分
  • 需要下载两个loader

    ​ npm i css-loader style-loader

    ​ 在main.js中引入css 依赖

    ​ require(./name.css) //一定加入./否则会报错

    如果需要可以安装less-loader或者sass-loader

//在webpack.config.js中添加以下
module: {
   rules: [{
     test: /\.css$/,
     use: [
         //webpack在使用多个loader时,是从右向左的,从下到上的
      {
        loader: "style-loader"//负责把样式添加到dom中
      },
      {
        loader: "css-loader"//只负责css文件的加载
      }
    ]
     }]
}

//    需要注意css 在HTML中的引入,需要output配合 
output: {
  filename: '[name].js',
  path: path.resolve(__dirname, '../dist'),
  publicPath: '/'
},
二、HTML
  • 需要下载三个loader

​ npm i file-loader html-loader extract-loader

config/webpack.dev.js
var path = require('path')  //node系统模块
 
module.exports = {  //暴露
entry: {   //入口文件
main: './src/main.js'
},
mode: 'development',  //开发模式 可使用production生产模式进行替换
output: {      //输出
filename: '[name].js',   //输出时文件名
path: path.resolve(__dirname, '../dist'),   //commonJs提供 文件名    -》输出路径
publicPath: '/'     //   html中的引入文件路径
},
devServer: {    //热跟新
contentBase: 'dist',    //服务器指向文件名。类似node中的静态资源加载
overlay:true //报错显示到浏览器
},
module: { //loader配置
rules: [{
test: /\.css$/,   // 正则css
use: [{
loader: "style-loader"   //渲染
},
{
loader: "css-loader"    //压缩
}
]
},
{
test: /\.html$/,  //正则 所有的html
use: [{
loader: "file-loader",  //文件输出
options: {  //名字
name: "[name].html"
}
},
{
loader: "extract-loader"  //与main.js分离,打包成一个独立的文件
},
{
loader: "html-loader",  //渲染,压缩
options: {
attrs: ["img:src"]
}
}
]
}
 
}
src/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
 
</head>
<body>
<div id="box">
 
</div>
</body>
<script src="/main.js"></script>

</html>

main/main.js代码

//依赖
requrie('./main.css')
requrie('./html.css'
三,图片

npm install file-loader --save-dev

npm install url-loader --save-dev

url-loader内置了file-loader,一般只需要安装url-loader即可,但是当加载的图片转化成base64时,limit后的值小于图片的大小时候,就需要下载file-loader

//file-loader
{
test: /\.(jpg|git|png)$/,   //图片
use: [{
loader: "file-loader",
options: {
name: "[name]-[hash:8].[ext]"  //压缩为一个名字8位哈希值的图片,[ext]表示扩展名
}
}]
}

//url-loader
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,//当图片小于limit值的时候,就会把图片编译成base64字符串的形式
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
}

四、webpack实现vue开发环境的搭建

webpack.config.js
var path = require('path')  //node系统模块,用于动态获取路径
const VueLoaderPlugin = require('vue-loader/lib/plugin'); //vue-loader 伴生插件 
module.exports = {  //暴露
entry: {   //入口文件
main: './src/main.js'
},
mode: 'development',  //开发模式 可使用production生产模式进行替换
plugins: [
    new webpack.BannerPlugin("最终版权归Snyu.L所有") //做版权声明;打包后bundle.js文件头部就会显示
new VueLoaderPlugin()   //vue-loader的VueLoaderPlugin
],
output: {      //输出
filename: '[name].js',   //输出时文件名
path: path.resolve(__dirname, '../dist'),   //commonJs提供 文件名    -》输出路径
publicPath: '/'     //   html中的引入文件路径
},
devServer: {    //热跟新
contentBase: 'dist',    //服务器指向文件名。类似node中的静态资源加载
overlay:true //报错显示到浏览器
},
resolve: {    //引入vue.js
alias: {
'vue$': 'vue/dist/vue.js'
}
}, 
module: { //loader配置
rules: [{
test: /\.css$/,   // 正则css
use: [{
loader: "style-loader"   //渲染
},
{
loader: "css-loader"    //压缩
}
]
},
{
test: /\.html$/,  //正则 所有的html
use: [{
loader: "file-loader",  //文件输出
options: {  //名字
name: "[name].html"
}
},
{
loader: "extract-loader"  //与main.js分离,打包成一个独立的文件
},
{
loader: "html-loader",  //渲染,压缩
options: {
attrs: ["img:src"]
}
}
]
},
{
test: /\.(jpg|git|png)$/,   //图片
use: [{
loader: "file-loader",
options: {
name: "[name]-[hash:8].[ext]"  //压缩为一个名字8位哈希值的图片
}
}]
},
{
test: /\.vue$/,   //压缩vue
use: [{
loader: "vue-loader"  //压缩vue的loader
}],
exclude: '/node_modules/'    // 排除压缩的文件
}
]
}
 
}
dist/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
 
</head>
<body>
<div id="box">
<app></app>
</div>
</body>
<script src="/main.js"></script>
 
</html>
src/app.vue
<template>
<div>
我是{{a}}  
</div>
</template>
 
 
<script>
export default {
name: 'app',
data:function(){
return {
a:'小渣渣'
}
}
}
</script>
 
 
<style>
 
</style>
ser/main.js
 import Vue from 'vue'
 import app from "./app.vue"
 
new Vue({
   el:'#box',
    components:{
    app
    }
   }
 
)

五.es6的语法处理

如果将es6的语法转化成es5的语法时,我们就需要babel

npm i --save-dev babel-loader@7 babel-core babel-preset-es2015

//配置方法
module: {
  rules: [
    {
      test: /\.m?js$/,
      exclude: /(node_modules|bower_components)/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env']//转化成2015的只需要写成['es2015']
        }
      }
    }
  ]
}

六.搭建Vue项目

1.先下载指定版本的vue,通过npm下载 :npm install vue -save

2.在main.js进行引入vue,在index.html中用

import Vue from "vue"
const app = new Vue({ //new Vue()
el:"#app",
data:{message:""},
})

//index.html
<div id="app"> <h1>{{message}}</h1></div>
//抽离成组件
//index.html
<div id="app"></div>

//app.vue,单独写一个app.vue放组件
<script>
export default {
    template:"<div></div>",
    data(){
        return{
            message:""
        }
    }
        methods{
            btn(){
                
            }
        }
}
</script>
//main.js
import Vue from "vue"
import App from "./vue/app.vue"
new Vue({
    el:"#app",
    template:"</App>",
    components:{App}
})


**注意:需要安装加载app.vue的npm方可实现编译

 npm i  vue-loader(注意版本或许会报错无法运行)   vue-template-compiler  --save-dev  //用于开发时依赖,最后上线打包后都会把template
     
    //webpackconfig.js中配置
rules:[
    ......
    {
      test:/\.vue$/ ,
        use:["vue-loader"]
    }
]
3.注意vue有两个版本一个版本是不支持有template模板的
  • runtime-only 代码中不可以有任何的template
  • runtime-compiler 代码中可以有template,因为compiler可以用于编译template

runtime-compiler 转义方式就是

先由模板template -->解析成ast(抽象语法树)–>转成render函数–> 虚拟dom ( vdom)–>ui

runtime-only 转义方式就是(性能更高 ,代码量更少,相对比runtime-compiler少6kb)

先由模板template–> 虚拟dom ( vdom)–>ui

4.综上所述需要指定版本方可使用,在webpack.config.js中配置

module.exports: {
	.....
    resolve:{
        //alias:取别名
        alias:{
            "vue$":"vue/dist/vue.esm.js"  //import Vue from "vue"引入的时候会去vue中找													//vue.esm.js这个版本,
        }
    }
}

七、打包html的plugin

1.目前我们的index.html是存放在根目录中的,在发布项目时候是在dist文件中的,但是如果没有index.html文件那么打包就没有意义;需要使用到插件HtmlWebpackPlugin插件:它可以让我们自动生成一个index.html的文件插入到body中

npm install html-webpack-plugin  --save-dev
//需要在webpack.config.js中配置
cosnt htmlwebpackplugin  = require("html-webpack-plugin")
plugins:{
    ....
    new htmlwebpackplugin({
        template:"index.html"//使用什么模板存放index.html
    })
}

八、js压缩的Plugin(丑化打包,开发阶段不需要,上线时候需要压缩)

npm i uglifyjs-webpack-plugin@1.1.1 - save-dev
//需要在webpack.config.js中配置
cosnt uglifyjsplugin  = require("uglifyjs-webpack-plugin")
plugins:{
    ....
    new uglifyjsplugin()
}

九、搭建本地服务器

npm i -save-dev webpack-dev-server@2.9.1

//需要在webpack.config.js中配置
devServer:{
    contentBase:"./dist",
        inline:true
}

//也可以在json中配置
"dev":"webpack-dev-server --open"   //直接打开服务器,打开本地服务npm run dev
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值