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是你开发写代码的文件夹

webpack+vue打包开发,生产环境_第1张图片
文件目录应该是这样子的

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

你可能感兴趣的:(webpack+vue打包开发,生产环境)