webpack

模块开发

一、·commonjs模块开发

1、大多数情况下我们都会存在在一个js文件中使用另一个js的方法和属性的时候,在这里我们就用到了模块化的到处和导入

(1)、commonjs的导出module.exports={传出的名称:对应要传出的属性名称或者方法}
(2)、commonjs的导入var/const/let {导入的属性名称或者方法名称}=require('./XXX.js')

二、ES6的模块开发

1、第一种导入导出

(1)、export导出属性或者方法,->export{xxx,xxx}
(2)、import {name,age,height} from './js/info.js导出

2、第二种导入导出

(1)、export default{}导出属性和方法,
(2)、import aaaa from "./XXX.js"导入

三、webpack安装

1、首先安装Node.jsNode.js自带软件包管理工具npm
2、查看自己的node版本,node -v(如果没显示则说明未安装成功,https://blog.csdn.net/weixin_39477597/article/details/87784418到网站进行相应的下载)
3、全局安装webpack(这里我指定版本号3.6.0,因为vue cli2依赖该版本):npm install [webpack@3.6.0](mailto:webpack@3.6.0) -g(注意:安装完成后,重新进入命令界面输入webpack -v看下是否成功,如果提示webpack不是有效命令说明未成功!!!)
4、局部安装webpack(后续才需要):--save-dev是开发的依赖,项目打包后不需要继续使用的。
5、安装指定版本的webpacknpm install --save-dev webpack@3.6.0(# 不要忘记webpack4.+开始webpack-cli是必备的哦)
6、 如需删除webpackhttps://www.jianshu.com/p/119a825d8bba

(1)、删除全局webpack-clinpm uninstall -g webpack-cli
(2)、删除本地(局部)webpack-clinpm uninstall webpack-cli
(3)、删除全局webpacknpm uninstall -g webpack
(4)、删除本地(局部)webpacknpm uninstall webpack

四、文件打包

1、js文件打包

22A5ED9BF3B2714649A052AF46C8CF10.jpg

src是开发的js文件夹,dist是用webpack发布的js文件夹,页面调用时调用dist文件夹中的js,用命令:webpack ./src/main.js ./dist/bundle.js意思是用webpacksrc中的main.js发布成dist中qq.js
1、 更具有智能化,只写一个webpack时,就会自动编译好js文件(推荐使用):

(1):其次在html的同一级创建名字叫webpack.configjs文件
(2):当webpack.config.js配置好是用webpack命令直接执行会更方便!!!!

const path = require('path')
module.exports = {
    entry:'./src/main.js',//需要编译的文件
    output:{
        path:path.resolve(__dirname,'dist')//这里是两个下划线,
        filename:'bundle.js'
    },
}

(3):首先在命令界面cd …找到html页面的上一级文件夹,然后用npm initpackage.json创建出来。
(4):在package.json文件中添加"build""webpack"字节,命令界面cd …找到html页面的上一级文件夹, 用命令npm run build把需要编译的js创建出来。

{
  "name": "meet",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^3.6.0"
  }
}

局部安装时npm install webpack@3.6.0 --save-dev安装成功后package.json会加入

图片.png

2、css文件打包

当有css文件时要在接收模块开发的js中加入require('./xxx/xxx.css')使得调用css文件,
添加成功后在webpack.config.js文件中加入

const path = require('path')

module.exports = {
    entry:'./src/main.js',//需要编译的文件
    output:{
        path:path.resolve(__dirname,'dist'),
        filename:'bundle.js'
    },
    module: {
        rules: [{
                test: /\.css$/,
                //css-loader只负责将css文件进行加载
                //style-loader负责将样式添加到DOM中
                //使用多个loader时,从右向左
                use: ['style-loader', 'css-loader'],
            }],
            }
}

module.exports中添加module字节,添加相应的loader配置,下面是loader文档文档连接https://www.webpackjs.com/loaders/,完成后,添加相应的loader命令,(这里添加的是style-loadercss-loader

:npm install style-loader --save-devnpm install css-loader --save-dev

webpack安装style-loader或者css-loader时报与webpack版本冲突的问题
基本上碰到的问题都是webpack版本和各loader版本不匹配的问题
解决问题的链接:https://blog.csdn.net/Xidian2850/article/details/103617081
可以到GitHub网站上面搜索对应的loader
这里以css-loader为例

图片.png

图片.png

先随便选择一个版本的package.json文件
图片.png

查看当前文件中位置webpack的版本号与我们当前的版本号对比,找到符合我们当前webpack版本的loader版本号
这里我们以webpack3.6.0css-loader为例
指定安装npm install --save-dev css-loader@0.28.0
其他的loader类似

3、打包图片文件
  1. 安装局部的url-loader,命令
npm install --save-dev url-loader@1。0.0版本的因为我用的webpack是3.6.0版本的(只要不起冲突就可以)

webpack.config.js文件中module字节中配置

{
                test: /\.(png|jpg|gif|jpeg)$/,
                use: [{
                    loader: 'url-loader',
                    options: {
                        //当加载图片小于limit时,会将图片编译成base64z字符串形式
                        //当加载的图片大于limit时,需要使用file-loader模块进行加载
                        limit: 8192,
                        name: 'img/[name].[hash:8].[ext]'
                    },
                }]
            },

2.如果图片小于limit中的值时,会将图片编译成base64字符串形式,

大于值时,需要下载file-loader 命令npm install --save-dev file-loader@0.11.0版本的因为我用的webpack是3.6.0版本的(只要不起冲突就可以)
最后在webpack.config.js文件中output字节中配置publicPath字节属性(其目的是为了在打包的css文件中引用的图片路径前加上dist/,因为打包的图片全都放到dist文件夹中)

output: {
        path: path.resolve(__dirname, 'dist'),
        filename:'bundle.js',
        publicPath:'dist/'
    },

3.基本完成了(注意,当需要打包的文件夹中img文件中有多个文件,文件中都有一个相同的图片名称,这样的话打包出来的就会报错了,需要在webpack.config.js文件中module字节中配置)

{
                test: /\.(png|jpg|gif)$/,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 8000,
                            name:'img/[name].[hash:8].[ext]' //把打包带图片放到dist中创建出来的img文件夹(自动创建)中,原来的名称+哈希值中的8位+点缀名
                        }
                    }
                ]
            }
(4)、ES6ES5-babel

安装局部的babel-loader,命令npm install --save-dev babel-loader@7 babel-core babel-preset-es2015

webpack.config.js文件中module字节中配置

安装局部的babel-loader,命令npm install --save-dev babel-loader@7 babel-core babel-preset-es2015

在webpack.config.js文件中module字节中配置
(5)、webpack打包vue

安装局部的vue,命令npm install vue@2.5.21 --save(去掉-dev是因为vue开发运行都需要)

webpack.config.js文件中resolve字节中配置

resolve:{
        alias:{
            'vue$':'vue/dist/vue.esm.js'
        }
    }

打包时报错:(这是因为vue版本过高的原因)

ERROR in ./src/main.js
Module not found: Error: Can't resolve 'vue' in '/Users/kuangzhipan/Desktop/VUE/LearnVuejs-V2/04、webpack配置vue/src'
 @ ./src/main.js 5:11-25
(6)、对.vue文件的封装处理

在开发过程当中如果我们需要添加/修改data中的数据的显示的话,又或者添加新的组件,都需要改动index.html
如下:
1、最开始的写法

    index.html文件
     <body>
        <div id="app">
            <h2>{{message}}</h2>
        </div>
        <script src="dist/bundle.js"></script>
    </body>
--------------------------------------------------这是分割线--------------------------------------------------
main.js文件
const app = new Vue({
    el:'#app',
    data:{
        message:'hahaha'
    }
})

2、在前面的Vue实例中,我们定义了el属性,用于和index.html中的#app进行绑定;然后我们可以通过定义temolate属性,让template模板的内容替换掉挂载的对应el的模板,如下:

 index.html文件
     <body>
        <div id="app">//这里什么都不需要写
        </div>
        <script src="dist/bundle.js"></script>
    </body>
--------------------------------------------------这是分割线--------------------------------------------------
main.js文件
const app = new Vue({
    el:'#app',
    template:'<div><h2>{{message}}</h2></div>',
    data:{
        message:'hahaha'
    }
})

3、如上写法当组件、方法数据多的时候,看着也很复杂和麻烦,我们可以通过组件的形式让Vue实例结构更清晰如下:

 index.html文件
     <body>
        <div id="app">//这里什么都不需要写
        </div>
        <script src="dist/bundle.js"></script>
    </body>
--------------------------------------------------这是分割线--------------------------------------------------
main.js文件
const App = {
    template:'<div><h2>{{message}}</h2></div>',
    data(){
        return{
            message:'he'
        }
    }
}
import Vue from 'vue'
const app = new Vue({
    el:'#app',
    template:'<App/>',
    components:{
        App
    },
})

4、为了让main.js文件结构更清晰,我们将组件部分提取出来,创建一个app.js文件;如下:

 app.js文件
export default {
    template: '<div><h2>{{message}}</h2></div>',
    data(){
        return{
            message:'哈哈哈'
        }
    }
}
--------------------------------------------------这是分割线--------------------------------------------------
main.js文件
import App from './vue/app.js'
import Vue from 'vue'
const app = new Vue({
    el:'#app',
    template:'<App/>',
    components:{
        App
    },
})

5、vue组件的引入

 App.vue文件
<template>
    <div><h2>{{message}}</h2></div>
</template>

<script>
    export default{
        data() {
            return {
                message: '哈哈哈!!!'
            }
        },
    }
</script>

<style>
</style>
--------------------------------------------------这是分割线--------------------------------------------------
main.js文件
import App from './vue/App.vue'
import Vue from 'vue'
const app = new Vue({
    el:'#app',
    template:'<App/>',
    components:{
        App
    },
})

打包运行的话会提示报错缺少相应的loader,这里我们需要安装vue-loadervue-template-compiler
通过上述的方法找到对应版本的vue-loader,这里是以webpack@3.6.0版本为基础(全文都是),使用如下命令安装loader

npm install --save-dev vue-loader@13.2.0npm install --save-dev vue-template-compiler

12B44A69E7B7268A3F612CA918711331.jpg

可能会出现上述问题,原因是:package.jsonVuevue-template-compiler版本不一致。
解决方法:

第一步:执行npm uninstall vue-template-compiler
第二步:执行npm install vue-template-compiler@报错中提示的vue的版本号

如上述图片中案例的解决方法为

npm uninstall vue-template-compiler
npm install --save-dev vue-template-compiler@2.5.21

6、如果在导入时import App from './vue/App.vue'后面的.vue想要省略的话需要在webpack.config.js文件中resolve字节中配置一下

resolve:{
    extensions:['.js','.css','.vue']
}
(7)webpackplugins(插件)的使用(场景:打包带文件中第一行注明版权问题)

BannerPlugin版权插件(webpack自带插件)在webpack.config.js文件中plugins字节中配置

156945D5FFAD18C18949DD3344AF2AE3.jpg

(8)、webpackhtmlplugins(插件)的使用(场景:打包时html文件,图片,js全都打包)

要注意和webpack版本相匹配

npm install --save-dev html-webpack-plugin@3.2.0   

然后还需要在webpack.config.js文件中plugins字节中配置

const HtmlWebpackPlugin = require('html-webpack-plugin')
plugins:[
        new webpack.BannerPlugin('最终版权归kkk所有'),
        new HtmlWebpackPlugin({
            template:'index.html'
        })
    ]

652CD80D52D20B918ABEAE9A113D90A5.jpg

(注意:把在output中配置的publicpath删除)

(9)、webpackjs压缩的plugins(插件)的使用(场景:打包时js文件时压缩js大小)

安装插件uglifyjs-webpack-plugin,这里指定了版本1.1.1

npm install --save-dev uglifyjs-webpack-plugin@1.1.1

webpack.config.js文件中plugins字节中配置

const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')
plugins:[
        new webpack.BannerPlugin('最终版权归kkk所有'),
        new HtmlWebpackPlugin({
            template:'index.html'
        }),
        new UglifyjsWebpackPlugin()
    ]
81BB658079B8FD5B716F007913B130C6.jpg

下面是上述提到问题完整的webpack.config.js代码

const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')

module.exports = {
    entry: './src/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js',
        // publicPath: 'dist/', //跟url相关的到时候都会往这里来解读
    },
    module: {
        rules: [{
                test: /\.css$/,
                //css-loader只负责将css文件进行加载
                //style-loader负责将样式添加到DOM中
                //使用多个loader时,从右向左
                use: ['style-loader', 'css-loader'],
            }, {
                test: /\.less$/,
                use: [{
                    loader: "style-loader" // creates style nodes from JS strings
                }, {
                    loader: "css-loader" // translates CSS into CommonJS
                }, {
                    loader: "less-loader" // compiles Less to CSS
                }]
            }, {
                test: /\.(png|jpg|gif|jpeg)$/,
                use: [{
                    loader: 'url-loader',
                    options: {
                        //当加载图片小于limit时,会将图片编译成base64z字符串形式
                        //当加载的图片大于limit时,需要使用file-loader模块进行加载
                        limit: 8192,
                        name: 'img/[name].[hash:8].[ext]'
                    },
                }]
            },
            {
                test: /\.js$/,
                exclude: /(node_modules|bower_components)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['es2015']
                    }
                }
            },
            {
                test:/\.vue$/,
                use:['vue-loader']
            }
        ]
    },
    resolve:{
        //alias-别名
        extensions:['.js','.css','.vue'],
        alias:{
            'vue$':'vue/dist/vue.esm.js'
        }
    },
    plugins:[
        new webpack.BannerPlugin('最终版权归kkk所有'),
        new HtmlWebpackPlugin({
            template:'index.html'
        }),
        new UglifyjsWebpackPlugin()
    ]
}

文章参考:https://www.cnblogs.com/Simple-520/p/15901020.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • webpack学习 一、初识webpack ​ 我们已经知道了模块化开发是非常重要和必要的了,而且也了解了一些...
    waigo阅读 950评论 0 2
  • 1 Webpack 1.1 概念简介 1.1.1 WebPack是什么 1、一个打包工具 2、一个模块加载工具 3...
    Kevin_Junbaozi阅读 6,673评论 0 16
  • 1、 Loader是什么? 1、我们之前打包的都是js文件,下面试试打包一个图片文件。 首先将一个图片文件放进sr...
    无争公子__阅读 507评论 0 0
  • 1.高效的开发离不开基础工程的搭建。2.近几年来,前端的工作早已不再是切图那么简单,项目比较大时,可能会多人协同开...
    NoNothing阅读 511评论 0 0
  • 1.什么是webpack? 从本质上来讲,webpack是一个现代的Javascript应用的静态模块化打包工具。...
    接下来的冬天阅读 731评论 0 0