Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

webpack4学习笔记(三) #30

Open
Rashomon511 opened this issue Jul 26, 2019 · 0 comments
Open

webpack4学习笔记(三) #30

Rashomon511 opened this issue Jul 26, 2019 · 0 comments
Labels

Comments

@Rashomon511
Copy link
Owner

Hot Module Replacement

HMR称为热模块替换,在前面我们知道webpack-dev-server在我们每次代码变更时都会自动刷新页面,但是我们想要的是只更新被修改代码都那部分页面显示,不希望页面全部刷新。这时候HMR可以来帮助我们实现这个功能

tips:webpack-dev-server打包后会把dist目录放到内存里,从而提升打包速度

好处:

  • 针对于样式调试更加方便
  • 只会更新被修改代码的那部分显示
...
    devServer: {
        contentBase: './dist',  // 起一个在dist文件夹下的服务器
        open: true,    // 自动打开浏览器并访问服务器地址
        proxy: {   // 跨域代理
            '/api': 'http: //localhost:3000'  // 如果使用/api,会被转发(代理)到该地址
        },
        hot: true,  // 开启HMR功能
        hotOnly: true  // 即使HMR不生效,也不自动刷新
    },
...
    plugins: [
    new HtmlWebpackPlugin({
        template: 'src/index.html'  // 模版html
    }), 
    new CleanWebpackPlugin(),
    new webpack.HotModuleReplacementPlugin()
    ],
...

有时候我们需要手动的实现模块热更新,但是css-loader,vue-loader,babelp-preset主流的loader已经帮我们做了module.hot.accept()的事情,所以webpack的HRM会实时显示。(可能有误)

if(module.hot) {
    module.hot.accept('./number', () => {
      ...dosomething
    })
}

Babel

使用babel来处理es6的代码
安装:

cnpm install babel-loader @babel/core -D  // 只是babel和webpack之间的桥梁,并不会将代码转译
 cnpm install @babel/preset-env -D   // 将es6的语法翻译成es5语法
 cnpm install @babel/polyfill --save   // @babel/polyfill 对es6语法在低版本浏览器上的补充

配置:

rules: [
        {
            test: /\.(e|j)s$/,  
            exclude: /node_modules/,  // 排除node_modules中的代码
            loader: "babel-loader",   // 只是babel和webpack之间的桥梁,并不会将代码转译
            options: {
                presets: [['@babel/preset-env', {
                    useBuiltIns: 'usage'  // 做@babel/polyfill补充时,按需的补充,用到什么才补充什么
                }]]   // 将es6的语法翻译成es5语法
            }
        }
]

使用@babel/polyfill做打包补充时,是通过全局变量到形式补充的,因此就可能会污染到全局环境。如果是对组件库进行打包的话由于不想库里面的函数污染到全局,那么就需要换一种配置方式。我们可以使用plugin-transform-runtime来对代码进行补充
安装:

npm install --save-dev @babel/plugin-transform-runtime
npm install --save @babel/runtime
npm install --save @babel/runtime-corejs2

配置:

        {
            test: /\.(e|j)s$/,  
            exclude: /node_modules/,  
            loader: "babel-loader",  
            options: {
                "plugins": [
                    [
                      "@babel/plugin-transform-runtime",
                      {
                        "corejs": 2,  //配置为2时必须安装@babel/runtime-corejs2
                        "helpers": true,
                        "regenerator": true,
                        "useESModules": false
                      }
                    ]
                  ]
            }
        }

由于babel里对配置相当的多,因此我们可以将options里面多内容放到.babelrc这个文件里,实现同样多结果

对react代码进行打包

可以使用@babel/preset-react来对jsx语法进行转移
安装:

npm install --save-dev @babel/preset-react

配置:

{
    presets: [ // 将es6的语法翻译成es5语法
        [
          "@babel/preset-env", {
            targets: {
               chrome: "67",
            },
            useBuiltIns: "usage" // 做@babel/polyfill补充时,按需的补充,用到什么才补充什么
          }
        ],
        "@babel/preset-react",
    ]   
}

babel的执行顺序是从下往上从右往左的顺序

疑问: webpack+react的模块热更新不生效问题,,其实是因为我们前面说了babel-preset内置了module.hot.accept();这样的功能,但是其实那样的说法是有误的,并没有内置,因此我们还是需要手动设置module.hot.accept();或者使用react-hot-loader

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant