002手动配置webpack的记录

与webpack有类似功能的工具grunt/gulp
1webpack 是什么?
打包工具(WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。)在此之前先了解前端模块化的背景

前端的模块化 以及AMD/CMD/CommonJS/es6 Module

前端模块化的背景以及CommonJS、AMD、CMD的发展和演变:
https://www.cnblogs.com/futai/p/5258349.html
es6 模块导出和导入常用方式

//导出  mymodule.js
export default function(){
   var a = 100;
}
//在其他文件使用时
import fn from 'mymodule'
fn();

CommonJs模块化常用方案

//导出
// module.js
let name = 'liakng xie';
let sayName = function () {
  console.log(name);
};

module.exports = { name, sayName }
//使用
// 通过 require 引入依赖
let module = require('./module.js');
module.sayName(); // likang xie

AMD模块化方案

define(['module'], function() {
  let name = 'likang xie';

  function sayName() {
    console.log(name);
  }
  
  return { sayName }
});

// 通过 require 引入依赖
require(['module'], function(mod) {
   mod.sayName(); // likang xie
})

CMD模块化方案

定义模块、使用模块
define(function(require, exports, module) {
  // 通过 require 引入依赖
   var otherModule = require('./otherModule');

   // 通过 exports 对外提供接口
   exports.myModule = function () {};

   // 或者通过 module.exports 提供整个接口
   module.exports = function () {};
});

理解CommonJs、AMD、CMD、ES6模块 https://www.jianshu.com/p/67ce52c93392
Webpack其实就是一个打包工具,他的思想就是一切皆模块,css是模块,js是模块,图片是模块。并且提供了一些列模块加载(各种-loader)来编译模块。官方推荐使用CommonJs规范,但是也支持CMD、AMD、ES6模块

2 webpack可以做什么
打包各种资源 css、 图片 、less、sass、typescript
转译 es6->es5
压缩代码
...

3 使用
webpack 3.版本和 4.版本
安装 webpack
npm i webpack webpack-cli -D(--save-dev)
4.*版本的webpack是不需要写配置文件就可以打包的,但是一般不这么干,为了使用起来更加灵活一般还是要对其进行相关配置,可以使用npx webpack 进行零配置打包。

进行打包的命令可以在package.json的文件夹下去配置 将 "scripts": {
"test": "echo "Error: no test specified" && exit 1"
}
配置为 "scripts": {
"build": "webpack"
}之后可以使用npm run build 来进行打包

打包时如果有没有手动去配置打包规则的话会自动寻找项目下的src目录中的index.js(必须是index.js其他名字会报错找不到相关模块)文件,打包完成后将生成的打包文件(main.js))自动放在创建的dist文件夹下,如果配置了打包规则则按照打包规则来进行打包。

4 配置webpack.config.js文件
const path = require("path");
module.exports = {
mode: "development",
// 指定入口文件
//entry: "./src/index.js",
entry: {
main: "./src/index.js"
},
// 指定输出打包后的目录及文件
output: {
path: path.resolve("./dist") ,// 绝对路径
filename: "bundle.js"
}
}

webpack本身只打包js,假如需要打包其他模块 需要合适的loader 加载器

打包css文件 需要style-loader和css-loader
安装:npm install style-loader css-loader -D
css-loader 处理样式中@import url
style-loader 使用js把css样式作为style标签的内容插入到页面中
安装完之后需要在webpack.config.js里面进行配置才可以打包css文件

Html-webpack-plugin插件
1 作用 根据配置的html产生一个引入打包后的html以方便测试
2 安装 npm install html-webpack-plugin
3 在webpack.config.js里面进行配置

webpack-dev-server 插件

  1. 作用 配置开发服务器 执行命令npm run dev 自动监听是否有修改 然后打包 打开浏览器
    2.安装 npm install webpack-dev-server -D
    3.在package.json文件中配置 此处"scripts": {
    "build": "webpack"
    },改为"scripts": {
    "build": "webpack",
    "dev":"webpack-dev-server"
    },
    这样一有更新会立马自动将更新同步到浏览器视图中

打包图片
file-loader url-loader (url-loader是比file-loader优化的版本)
1 安装 npm i file-loader url-loader -D
2 配置 见webpack.config.js

less的打包
less
less less-loader style-loader css-loader
1 安装 npm i less less-loader style-loader css-loader -D
2 配置 见webpack.config.js

vue 打包
1 安装 npm i vue -S
npm i vue-loader vue-template-compiler-D
2 配置 见webpack.config.js
webpack手动配置的一个实例
项目目录


微信图片_20190513151615.png

配置的package.json


微信图片_20190513152605.png

手动配置的webpack.config.js文件

//此文件用来写webpack的相关配置,进行相关配置后就会根据配置过的信息来进行打包
//引入path模块
const path = require('path');
//引入生成html的模块
const HtmlCreate = require('html-webpack-plugin');
//vue打包用
const VueLoaderPlugin = require('vue-loader/lib/plugin');
//导出一个对象,里面包含设置的打包设置
module.exports = {
    mode:'development',//此配置是用来去除打包时的警告信息 此处可以填写development和production 一个打包之后的代码有缩进,一个会对打包后的代码进行压缩
    //指定打包的入口文件 将来打包时会自动寻找入口文件下的文件作为打包文件
    // entry:'./src/index.js',
    //指定输出打包后的目录和文件会自动创建
    //以上可以写成如下的形式
    entry:{
       main:'./src/index.js'
    },
    output:{
        path:path.resolve('./dist'),//绝对路径
        //filename:'bundle.js' //指定打包后的文件名 一般为了好的体验这里通常采用另一种操作
        //发布新版本,发现用户正在浏览老网页 需要刷新一次才能看新版 
        // 发新版时候 会把老目录全部删除 然后覆盖最新文件上去 
        // 增量覆盖
        filename:"[name].[hash:12].js"
    },
    resolveLoader:{
        modules:[path.resolve('./src/loader'),path.resolve("./node_modules")]
    },
    //配置其他文件的打包规则
    module:{
        rules:[
            {
                test:/\.js$/,
                //自己写的loader添加到打包规则里,js在加载时都要先走这个规则,可以使用绝对路径
                //use:[path.resolve('./loader/myloader.js')]
                //或者使用一下方式 但是要配置resolveLoader中自己写的loader的路径地址
                use:['myloader']
            },
            {
                test:/\.css$/,//对css问价进行打包配置
                loader:['style-loader','css-loader'] //引入对css文件处理的加载器
            },
            {
                test:/\.(jpg|jpeg|png|svg|gif|woff)$/,
                //use:['file-loader']
                //对于某些体积较小的图片可以直接将其加入到html里面不必再打包到dist文件夹下
                use:['url-loader?limit=40000']
            },{
                test:/\.less$/,
                loader:['style-loader','css-loader','less-loader']
            },{
                test:/\.vue$/,
                loader:['vue-loader']
            }
        ]
    },
    plugins:[
        /*
         1.读取模板内容 2.得到产出文件 3.将产出文件作为script标签插入到html标签中 4.将html写入指定目录
        */
       new HtmlCreate({
           template:'./src/index.html',//将src目录下面的index.html当成html模板
           filename:'index.html',//产出文件的名字 自己设置一般设置为index.html
           //去除引入文件的双引号以便节省空间压缩体积
           minify:{
               removeAttributeQuotes:true
           }
       }),
        // 请确保引入这个插件!//vue打包用
        new VueLoaderPlugin()
    ]
}

以上便是手动做的一个webpack的配置,比较繁琐,所以在去创建vue项目的时候一般会使用vue的脚手架工具,脚手架工具对这些内容都做了配置,这会大大加快项目开发的效率。

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

推荐阅读更多精彩内容

  • 冷天的清晨,起床是需要勇气的。 今天任务艰巨,不得不一鼓作气地离开了温暖的被窝。想着越是寒冷,越是消耗热量,便给自...
    橙式节奏阅读 377评论 2 3
  • 最近看了《自控力》这本书,我才认识到,原来,我有两个我。一个是我的意识,一个是我们的身体,我们理所应当的认为,我们...
    一只叨叨阅读 880评论 0 0
  • 我有两个典故,我半生的蹉跎岁月,好多的无聊是靠它们来打发的,今天给你得喽其中一个。 小时候,村里,酷暑天,胡...
    范范A阅读 631评论 0 3
  • 对于我这种身高不过165, 体重恒定100+的半二级残废来说,是应该做点什么来调理自己了。因为我们家最近都爸爸妈妈...
    _爱丽丝阅读 270评论 0 0