javascript

webpack 使用入门

2018-04-23  本文已影响0人  ysp123

node安装就自行百度吧!

确保你已经进入项目根目录,npm init 创建 package.json 文件 

webpack安装可以全局安装也可以本地安装:

全局安装:npm install -g webpack

本地安装:npm install webpack --save/--save-dev

简写方式 : npm i webpack -D

# –save:模块名将被添加到dependencies,可以简化为参数-S。

# –save-dev: 模块名将被添加到devDependencies,可以简化为参数-D。

配置webpack.config.js文件

const path = require('path');

module.exports = {

    entry:'入口文件',

    output:{

        path:path.resolve(__dirname,'./dist'),   //出口文件目录 

        filename:'bundle.js'      //出口文件名称

    }

}

多入口文件名的问题时,我们使用了[name]来根据入口文件自动生成文件名。(多入口文件格式为对象{--,---,--})

多入口文件名的问题时,我们使用了[name]来根据入口文件自动生成文件名。

除了[name]之外,我们往往需要给文件名增加[hash]值来解决缓存的问题(即代码更新后,由于文件名的不同,强制用户下载最新的代码)。

filename:'dist.[hash].js'

使用[hash]时,这里的hash值,即使文件没有改变,每次生成的结果也不同。

如果想让模块没有改变时,hash值不改变,那么应该使用[chunkhash]替代[hash]。

chunk表示模块,chunkhash就是指根据模块内容计算出来的哈希值。

模板描述特点

[hash]              模块标识符(module identifier)的hash            每次都不同(低版本webpack可能有问题)

[chunkhash]     chunk 内容的 hash                                          模块内容不变,hash值不变(不能和hash同时使用)

[name]             模块名称                                                           就是entry的key,单入口缩写写法默认是main

[id]                       模块标识符(module identifier)                        默认情况下是例如'0','1'之类

[query]          模块的 query,例如,文件名 ?  后面的字符串              我也没搞懂这个

filename:'dist.chunkhash=[chunkhash:10].name=[name].id=[id].js'

启用了 [hash] 和 [chunkhash] 占位符。这个占位符,会根据哈希值,在打包好的js文件的文件名中,添加一段hash值。

而这个hash值显然是不可预期的,如果我们每次都在html里手动去写这些js文件名,不仅傻,还容易漏和犯错。

解决步骤:

webpack不能全局安装(虽然也可以,但是会造成污染),因此我们先在当前文件夹下安装一次webpack:npm install --save webpack;

我们还需要安装一个webpack插件:npm install --save-dev html-webpack-plugin;

除此之外,我们需要配置一下webpack文件。做两件事:1、引入插件;2、配置插件;

//webpack.config.js

//引入插件

constHtmlWebpackPlugin=require('html-webpack-plugin');

module.exports={

//入口文件,指向app.js

entry:'./app.js',//

出口文件

output:{        

path:__dirname+'/dist',       

 filename:'dist.chunkhash=[chunkhash:10].name=[name].id=[id].js

'},

//将插件添加到webpack中

plugins:[

//这里是添加的插件

newHtmlWebpackPlugin({            

title:'My HTML'})    

]}

最后,如之前一样,运行npm run test,会发现在dist文件夹下,除了之前的js文件,还出现了一个html文件,而这个html文件引入了我们打包好的js文件。

解决一个常见需求:

我通过CDN引入jQuery(或其他类似资源);

并且该资源可能是一个,或者多个;

或者是其他已经写在html里的文件内容;

我不想在自动打包好html后,再去手动插入script标签或者其他类似标签;

因此我希望以某个html文件为模板,额外加入打包好的js文件;

因此我们需要对这个插件进行配置:[HtmlWebpackPlugin的文档(英文)](https://github.com/jantimon/html-webpack-plugin#configuration)

对于这个需求,我们只需要配置一些简单的东西:

plugins:[

//这里是添加的插件

newHtmlWebpackPlugin({        

title:'title',//html的title(就是title标签里的东西)

filename:'index.html',//重写后的html文件名,默认是index.html

template:'./demo.html',//这个就是那个模板文件,不会改动原有的内容,而是在原来html文件的末尾,将打包编译好的文件添加进去

})]

使用ES6规范的js代码,转为ES5。(https://github.com/qq20004604/webpack-study/tree/master/5%E3%80%81Loader/babel_loader)

npm install --save babel-loader babel-core babel-preset-env webpack

但是,这个只能转一些普通的es6语法,像例如Promise、Set之类的,他是无法转换的。

如果想要转换这些,我们需要做一些额外的工作。

首先安装插件

npm install  babel-runtime  --save

npm install  babel-plugin-transform-runtime  --save-dev

babel-runtime(也就是上面plugins数组中的transform-runtime),解决了辅助代码(即让我们可以使用新特性的代码)被默认添加到每一个需要他的文件的问题(这会导致文件过大)。

具体解决方法是禁用了babel对每个文件的runtime注入,引入 babel-plugin-transform-runtime 并且使所有辅助代码从这里引用。

表现效果:假如A模块异步加载B模块,A、B模块里都使用了Set,那么为了使A模块正常运行,引入了某些代码。然后因为B模块又是被A模块引入的,那么B模块在被加载的时候,A模块里已经引入的代码,就没必要再次引入了,所以B模块里是不存在A模块引入的那些兼容代码的。

不使用 .babelrc 文件,而是直接写在babel-loader里。

module: {

    // loader放在rules这个数组里面    rules: [

        {

            test: /\.js$/,

            exclude: /node_modules/,

            loader: 'babel-loader',

            options: {

                presets: ['babel-preset-env'],

                plugins: ['transform-runtime']

            }

        }

    ]

}

module: {

    // loader放在rules这个数组里面    rules: [

        {

            test: /\.js$/,

            exclude: /node_modules/,

            // 区别在这里            use: {

                loader: 'babel-loader',

                options: {

                    presets: ['babel-preset-env'],

                    plugins: ['transform-runtime']

                }

            }

        }

    ]

}

上一篇 下一篇

猜你喜欢

热点阅读