webpack+vue打包开发,生产环境

参考资料webpack指南

最近在学习webpack的一些资料的整理,免得自己日后忘记,现在写一下开发的过程先。

首先装一个node,node官网安装教程就省略了

打开控制台输入生成文件夹并打开,初始化一下项目

mkdir demo1 && cd demo1.

npm init

然后装一下webpack和webpack-dev-server ,webpack是打包工具,webpack-dev-server是基于webpack一个简单的 web 服务器,并且能够实时重新加载。

我是建议你用cnpm国内的镜像站,装起来飞快,毕竟墙外的东西有可能慢的要死

npm install --save-dev webpack  webpack-dev-server

不推荐全局安装 webpack。这会将你项目中的 webpack 锁定到指定版本,并且在使用不同的 webpack 版本的项目中,可能会导致构建失败。(来自webpack指南的建议)

接下来装一下会用到的loader

html: 

        html-loader(这个是用来解析html的,不过我一般很少用这个)

css: 

        style-loader(webpack的样式加载器 通过注入 style 标签引入样式) 

        css-loader (通过 webpack 配置,CLI或内联使用 loader)

        less-loader (添加对LESS的支持)

        less (LESS模块)

        postcss-loader (不想写浏览器前缀你就老实加上吧)

        autoprefixer (自动添加万恶之源浏览器前缀)

        optimize-css-assets-webpack-plugin (压缩css代码)

js:

        babel-core 

        babel-loader

        babel-preset-env (使你可以畅快使用ES 6 7 ...N的牛逼哄哄的JavaScript 的编译器 支持,会帮你自动将新版本的JavaScript编译成浏览器认识的样子)

        babel-plugin-transform-vue-jsx 

        babel-helper-vue-jsx-merge-props (这两个是vue-jsx的支持,不写jsx可以不装)    

        uglifyjs-webpack-plugin (压缩JS代码的插件)

file:

        file-loader

        url-loader (一般用来处理资源文件的loader)

vue:

        vue (vue框架)

        vue-template-compiler

        vue-loader (Vue 组件转换为 JavaScript 模块,各种特性,贼牛逼,感兴趣就去看看vue-loader

分类打包

html:

        html-webpack-plugin

css:

        extract-text-webpack-plugin

node_env

        cross-env (提供一个设置环境变量的scripts,简单点说就是你可以通过传递NODE_ENV告诉代码你是开发环境还是生产环境)

npm i --save-dev html-loader style-loader css-loader less-loader less postcss-loader autoprefixer optimize-css-assets-webpack-plugin babel-core babel-loader babel-preset-env babel-plugin-transform-vue-jsx babel-helper-vue-jsx-merge-props uglifyjs-webpack-plugin url-loader vue vue-loader html-webpack-plugin extract-text-webpack-plugin cross-env clean-webpack-plugin  file-loader  vue-template-compiler 帮忙  

在package.json里面的scripts中加入这个命令,加入之后你就不用老是敲又臭又长的命令行了,直接npm run dev/dist即可

"dist": "cross-env NODE_ENV=dist webpack --config webpack.config.js",

"dev": "cross-env NODE_ENV=dev webpack-dev-server --open"

写一个webpack.config.js配置文件

首先我们把要用到的一些东西引入进来

const path = require('path');//路径

const HtmlWebpackPlugin = require('html-webpack-plugin');

//引入html-webpack-plugin 打包index.html

const CleanWebpackPlugin = require('clean-webpack-plugin');

//清理dist文件夹

const extractTextWebpackPlugin = require('extract-text-webpack-plugin');

//打包样式

const webpack = require('webpack');

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');//压缩js

const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');//压缩css

const isDev = process.env.NODE_ENV === 'dev';//环境参数

先定义一个对象config

config = {

        entry: {

            //entry 是入口起点,我们的资源文件通过此js进行引入

            app: './src/js/index.js'

        },

        output: {

            //输出文件

            filename: '[name].bundle.js',

            path: path.resolve(__dirname, 'dist')

        },

        plugins:[

                    //配置插件

                    new webpack.DefinePlugin({

                        'process.env':{

                            NODE_ENV: isDev ? '"dev"' : '"dist"'//传递环境变量

                        }

                }),

                //生成index.html的插件

                new HtmlWebpackPlugin({

                    title:'123'

                })

        ],

        module:{

            //模块参数

            rules:[

                //处理ES6.7....n和vue-jsx 这里还需要一个.baelrc的文件来输入配置

                {

                        test: /(\.jsx|\.js)$/,

                       use: {

                           loader: "babel-loader"

                       },

                       exclude: /node_modules/

                 },

                //处理静态资源文件 并输出到imgaes目录下

                {

                    test:/\.(gif|jpg|jpeg|png|svg)$/,

                    use:[

                        'url-loader?limit=10000&name=images/[name].[ext]'

                     ]

                }

            ]

    }

};

由于开发和生产环境的不同配置也需要不一样,根据isDev来判断,先来配置一下开发环境的代码,这里要用 webpack-dev-server 来搭建一个简单的web服务器。

处理css的时候一般在生产环境才把他们打包到一个css文件中,在开发环境直接让它插在代码中编译起来更加快一点

// webpack-dev-server配置

config.devServer = {

    contentBase: "./dist",//本地服务器所加载的页面所在的目录     historyApiFallback: true,//不跳转 inline: true//实时刷新

};

config.devtool='inline-source-map';

//由于开发环境的代码都会被打包到一个js中,我们添加一个source-map.方便你开发 的时候快速定位到代码

config.plugins.push(

    new webpack.HotModuleReplacementPlugin(),

    //模块热替换

    new webpack.NoEmitOnErrorsPlugin()

    // 在编译出现错误时,使用 NoEmitOnErrorsPlugin 来跳过输出阶段。这样可以确保输出资源不会包含错误

);

config.module.rules.push(

{

        test:/\.less$/,

        use:[

            'style-loader',

            'css-loader',

            'less-loader',

            {

                loader:'postcss-loader',     //代码自动补全,浏览器前缀添加

                options: {

                        plugins:(loader) =>[ require('autoprefixer')({browsers :[' last 5 versions']}) ]

                }

            }

    ]

},

//处理.vue文件的loader

{

    test:/\.vue$/,

    use:[

        {     

            loader:'vue-loader'

        }

    ]

}

)

配好开发环境后,还要配一下生产环境的代码

config.entry = {

    app: path.join(__dirname,'./src/js/index.js'),

    vendor:['vue']    //声明要抽离的类库

}

config.module.rules.push(

{

    test:/\.less$/,

    use:extractTextWebpackPlugin.extract({

            //通过调用这个方法来把css从js代码中提取出来

            fallback:'style-loader',

            use:[

                'css-loader',

                'less-loader',

                {

                    loader:'postcss-loader',

                    options:{

                        plugins:(loader) =>[require('autoprefixer')({browsers :[' last 5 versions']})]

                       }

                }

            ]

    })

},

{

    test:/\.vue$/,

    use:[

        {

            loader:'vue-loader',

            options: {

                    extractCSS: true

                }

         }

    ]

}

);

config.plugins.push(

    new CleanWebpackPlugin(['dist']),    //清理打包文件夹

    new extractTextWebpackPlugin('styles.[contentHash:8].css'),    //输出 styles.css文件

    new webpack.optimize.ModuleConcatenationPlugin(),

    new webpack.optimize.CommonsChunkPlugin({

        //分离出类库

       name:'vendor'

    }),

    new OptimizeCssAssetsPlugin({     

        //css压缩

        assetNameRegExp: /.css$/g,

        cssProcessor: require('cssnano'),

        cssProcessorOptions: {

            discardComments: {

                removeAll: true

            }

        },

        canPrint: true

    }),

    new webpack.optimize.CommonsChunkPlugin({

       name:'runtime'

    }),

    new webpack.BannerPlugin('版权所有,翻版必究'),

    new UglifyJsPlugin({

        //压缩js代码

        test: /\.js($|\?)/i

    })

);

config.output.filename = 'js/[name].[chunkhash:8].js';    //定义输出的js

这样子配置算是写完了最后再加一句

module.exports = config;

还有要配置一下 .babelrc文件,此文件跟webpack.config.js同级即可

{

  "presets": ["env"],

  "plugins": ["transform-vue-jsx"]

}

dist是打包之后的文件夹

src是你开发写代码的文件夹

文件目录应该是这样子的

写到这里也就差不多了,下次再往里面配置一下express吧。

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

推荐阅读更多精彩内容

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 11,019评论 0 21
  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,656评论 7 110
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,266评论 4 31
  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,125评论 7 35
  • 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过...
    阳阳阳一堆阳阅读 3,253评论 0 5