从零开始使用webpack搭建项目


  

   如果没有脚手架, 该如何使用webpack搭建项目呢? 

    (开发环境需要先安装node)

  1. 新建一个空文件夹,此处命名为webpack_test;
  2. webpack_test下新建src文件夹,src下新建一个main.js,后续可配置为入口文件;
  3. src下新建js、css、img文件夹,用于存放开发时的js文件,css文件,img文件等,待后续用;
  4. webpack_test下新建index.html文件,作为网页首页;
  5. 打开终端,全局安装webpack:npm install webpack -g (-g表示全局安装);
  6. 切换到webpack_test目录下,局部安装webpack: npm install --save-dev webpack(--save表示局部安装,-dev表示开发时依赖,即项目在运行时不会依赖webpack,因为webpack是帮助项目进行模块化打包);安装完成后,webpack_test目录下多了node_modules文件夹。
  7. 在webpack_test目录下,输入命令:npm init 初始化package.json文件,可用于配置项目有关的。终端会询问package name: (webpack_test)等问题,其中entry point: (index.js) 是指定入口文件,可直接回车默认,也可输入main.js这样的名字,指定到之前建的main.js。其他可直接一路回车完成初始化;
  8. 在webpack_test目录下,新建一个dist文件夹,用来存放webpack打包后生成的文件,如bundle.js文件、图片等,见后文;目前,项目结构基本如下:(js文件夹下放了一个自己写的简单的mathUti.js文件)
  9. 由于使用了模块化的语法,需要webpack打包转化成浏览器可识别的语法,所以在终端输入命令:webpack ./src/main.js ./dist/bundle.js。(在终端使用webpack命令用的是全局webpack, 我这里因为版本问题会报错)
  10. 在package.json的“scripts”下,添加“build”:“webpack”,这样在终端执行npm run build就可以执行webpack这个打包命令。
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "build": "webpack"
      },
  11. 在webpack_test下创建一个webpack.config.js,这是webpack的配置文件,可配置webpack的输入输出目录。
    const path = require('path'); //引入node.js的path模块,用于处理文件路径
    module.exports = {
        entry:"./src/main.js",  //指定入口文件
        output: {  
            path : path.resolve(__dirname, 'dist'),  //指定出口路径,拼接一个绝对路径,而且是根据文件位置动态变化的。
            filename :"bundle.js" //指定出口文件名
        }
    }
  12. 以上配置至此,在终端运行npm run build,已经能够使main.js中的两个console.log成功打印。
  13. 安装css-loader, 配置css-loader。在css文件夹下新建一个easy.css文件,并设置body的background-color。
    body {
        background-color: orange;
    }

    为了让css文件能正常打包,需要安装css-loader和style-loader: npm install --save-dev css-loader style-loader, 并在webpack.config.js中添加配置,在上述配置的module.exports中平级于output添加:

    module:{
            test: /\.css$/,
            use:['style-loader','css-loader'],
        }

    还需要在main.js中添加依赖

    require('./css/easy.css')

    这样可看到背景颜色有了效果。

  14. 如果使用了less,则也需要安装和配置:less-loader, less,配置less-loader。安装:npm install --save-dev less-loader less; 配置:
    module:{
            rules:[
                {
                    test: /\.css$/,
                    use: ['style-loader', 'css-loader'],
                },
                {
                    test:/\.less$/,
                    use:[{
                        loader:'style-loader'
                    },
                    {
                        loader: 'css-loader'
                    },
                    {
                        loader: 'less-loader'
                    }
                    ],
                }
            ]
        }

    也需要在main.js中添加依赖,

    require('./css/lesstest.css')

    如果没用到less,则不需要这些操作。

  15. 安装url-loader,配置url-loader。如果有图片需要打包,则需要安装和配置url-loader。安装:npm install --save-dev url-loader file-loader。配置:
    {
                    test:/\.(png|jpg|gif|jpeg)$/,
                    use:[{
                        loader: 'url-loader',
                        options:{
                            limit:8192,  //小于这个limit的图片会被base64编码,大于时需要使用file-loader来加载。
                            name: 'img/[name].[hash:8].[ext]' //配置打包后的图片,放置在img文件夹下,名字后跟8位hash值以保持名字独特性。
                        }
                    }]
                },

    由于浏览器加载的是打包后的图片,在dist目录中,所以需要在webpack.config.js中添加publicPath:

    output: {
            path : path.resolve(__dirname, 'dist'), 
            filename :"bundle.js",
            publicPath:"dist/"    //添加这个
        },

    例子:将esay.css中的background-color改为background,

    body {
        /* background-color: orange; */
        background: url('../img/bb.jpg');
    }

    因为使用的图片bb.jpg大一limit限制,如果没有配置publicPath, 则用npm run build打包后,页面的背景图不会生效,因为浏览器渲染出来的图片路径不对。

  16. 安装babel-loader,配置。为了将文件中的ES6语法转化为ES5的。注意babel-loader和babel-core版本需要匹配。安装:npm install --save-dev babel-loader@7 babel-core babel-preset-es2015。 配置:
    {
                    test:/\.js$/,
                    use:[{
                        loader:'babel-loader',
                        options:{
                            preset:['es2015']
                        }
                    }]
                },

     

  17. 安装vue, npm install --save vue(注意:-dev是开发时依赖,而vue在运行时也要依赖vue包,所以不加-dev)。
  18. 安装: npm install --save-dev vue-loader, vue-template-compiler  ,配置:
    {
                    test:/\.vue$/,
                    use:['vue-loader']
                }

    用于加载.vue后缀的文件。运行时,(注意这个报错:bundle.js:944 [Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.)是因为vue有开发模式和发布模式,我们使用的runtime-only build模式下没有模板编译器。可以添加一个配置,暂时解决这个问题:在webpack.config.js中,平行于output,添加如下配置

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

    注意,这个方法时是暂时解决,后续有其他方式。 这个配置是指定node_modules包下的vue/dist/vue.esm.js来进行编译,即使用vue的开发模式。

  20. 开发模式和生产模式下build一个项目有很大区别,在开发模式下,我们希望强大的source mapping以及热更新等功能,而生产模式下,我们希望项目体积更轻便加载时间更短,所以常推荐将webpack.config.js分离出来,包括一个基础的配置,一个开发环境配置,一个生产环境配置。可通过webpack-merge套件来将他们合并。首先需要安装:npm install --save-dev webpack-merge。使用的时候需要require('webpack-merge').如下是生产环境配置。

     

     

     

     

    const baseConfig = require('./base.config');
    const merge = require('webpack-merge');
    const htmlWebpackPlugin = require('html-webpack-plugin');
    module.exports = merge(baseConfig, {
        plugins:[
            new htmlWebpackPlugin(
                {template:'index.html'}
            )
        ]
    })

     

  21. 安装html-webpack-plugin, 使打包的时候可根据已有模板生产一个html文件。安装:npm install --save-dev html-webpack-plugin。这样可以去掉之前配置的publicPath.
    output: {
            path: path.resolve(__dirname, 'dist'),
            filename: "bundle.js",
            publicPath: "dist/"  //去掉这个
        },

     

  22. 搭建本地服务器。安装:npm install --save-dev webpack-dev-server。配置:
    module.exports = merge(baseConfig, {
        devServer:{
            contentBase: "../src", //注意路径。监听的目录
            inline: true
        }
    })

     

  23. 更改package.json里的scripts属性的参数
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",   
        "build": "webpack --config ./build/prod.config.js",    //指定配置文件的目录
        "dev": "webpack-dev-server --open --config ./build/dev.config.js"  //--open配置热更新自动打开网页。 --config指定配置文件的目录
      },

     

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM