如何在webpack.config里面支持babel configes6插件

babel@6.2.0预编译的ES6代码无法在IE8上愉快的运行,各位前辈有办法吗? - 知乎166被浏览9481分享邀请回答104 条评论分享收藏感谢收起phabricator.babeljs.io/T2817 几个月还没修,所以还是不行的。目前的 workaround,你可以使用
提到的 es3ify ,或者使用 uglifyjs 再做一次转换。注意,为了兼容 IE8,光使用上述 plugins 还是不够的。你可能还需要使用 、 等 plugins,以及使用 polyfill / shim。最后吐槽下,babel 确实还是有不少 bug……114 条评论分享收藏感谢收起查看更多回答> 博客详情
什么是Webpack?
事实上它是一个打包工具,而不是像RequireJS或SeaJS这样的模块加载器,通过使用Webpack,能够像Node.js一样处理依赖关系,然后解析出模块之间的依赖,将代码打包
安装Webpack
首先得有Node.js
然后通过npm install -g webpack安装webpack,当然也可以通过gulp来处理webpack任务,如果使用gulp的话就npm install --save-dev gulp-webpack
配置Webpack
Webpack的构建过程需要一个配置文件,一个典型的配置文件大概就是这样
var&webpack&=&require('webpack');var&commonsPlugin&=&new&monsChunkPlugin('common.js');module.exports&=&{
&&&&entry:&{
&&&&&&&&entry1:&'./entry/entry1.js',
&&&&&&&&entry2:&'./entry/entry2.js'
&&&&output:&{
&&&&&&&&path:&__dirname,
&&&&&&&&filename:&'[name].entry.js'
&&&&resolve:&{
&&&&&&&&extensions:&['',&'.js',&'.jsx']
&&&&},&&&&module:&{
&&&&&&&&loaders:&[{
&&&&&&&&&&&&test:&/\.js$/,
&&&&&&&&&&&&loader:&'babel-loader'
&&&&&&&&},&{
&&&&&&&&&&&&test:&/\.jsx$/,
&&&&&&&&&&&&loader:&'babel-loader!jsx-loader?harmony'
&&&&&&&&}]
&&&&plugins:&[commonsPlugin]
这里对Webpack的打包行为做了配置,主要分为几个部分:
entry:指定打包的入口文件,每有一个键值对,就是一个入口文件
output:配置打包结果,path定义了输出的文件夹,filename则定义了打包结果文件的名称,filename里面的[name]会由entry中的键(这里是entry1和entry2)替换
resolve:定义了解析模块路径时的配置,常用的就是extensions,可以用来指定模块的后缀,这样在引入模块时就不需要写后缀了,会自动补全
module:定义了对模块的处理逻辑,这里可以用loaders定义了一系列的加载器,以及一些正则。当需要加载的文件匹配test的正则时,就会调用后面的loader对文件进行处理,这正是webpack强大的原因。比如这里定义了凡是.js结尾的文件都是用babel-loader做处理,而.jsx结尾的文件会先经过jsx-loader处理,然后经过babel-loader处理。当然这些loader也需要通过npm install安装
plugins: 这里定义了需要使用的插件,比如commonsPlugin在打包多个入口文件时会提取出公用的部分,生成common.js
当然Webpack还有很多其他的配置,具体可以参照它的
如果通过npm install -g webpack方式安装webpack的话,可以通过命令行直接执行打包命令,比如这样:
$webpack&--config&webpack.config.js
这样就会读取当前目录下的webpack.config.js作为配置文件执行打包操作
如果是通过gulp插件gulp-webpack,则可以在gulpfile中写上gulp任务:
var&gulp&=&require('gulp');var&webpack&=&require('gulp-webpack');var&webpackConfig&=&require('./webpack.config');
gulp.task("webpack",&function()&{&&&&return&gulp
&&&&&&&&.src('./')
&&&&&&&&.pipe(webpack(webpackConfig))
&&&&&&&&.pipe(gulp.dest('./build'));
使用Babel提升逼格
Webpack使得我们可以使用Node.js的CommonJS规范来编写模块,比如一个简单的Hello world模块,就可以这么处理:
var&React&=&require('react');var&HelloWorldComponent&=&React.createClass({
&&&&displayName:&'HelloWorldComponent',
&&&&render:&function()&{&&&&&&&&return&(&div&Hello&world&/div&);
module.exports&=&HelloWorldC
等等,这和之前的写法没啥差别啊,依旧没有逼格...程序员敲码要有geek范,要逼格than逼格,这太low了。现在都ES6了,React的代码也要写ES6,babel-loader就是干这个的。能够将ES6代码转换成ES5。首先需要通过命令npm install --save-dev babel-loader来进行安装,安装完成后就可以使用了,一种使用方式是之前介绍的在webpack.config.js的loaders中配置,另一种是直接在代码中使用,比如:
var&HelloWorldComponent&=&require('!babel!jsx!./HelloWorldComponent');
那我们应当如何使用Babel提升代码的逼格呢?改造一下之前的HelloWorld代码吧:
import&React&from&'react';
export&default&class&HelloWorldComponent&extends&ponent&{
&&&&constructor()&{
&&&&&&&&super();&&&&&&&&this.state&=&{};
&&&&render()&{&&&&&&&&return&(&div&Hello&World&/div&);
这样在其他组件中需要引入HelloWorldComponent组件,就只要就可以了:
import&HelloWorldComponent&from&'./HelloWorldComponent'
怎么样是不是更有逼格了?通过import引入模块,还可以直接定义类和类的继承关系,这里也不再需要getInitialState了,直接在构造函数constructor中用this.state = xxx就好了
Babel带来的当然还不止这些,在其帮助下还能尝试很多优秀的ES6特性,比如箭头函数,箭头函数的特点就是内部的this和外部保持一致,从此可以和that、_this说再见了
['H',&'e',&'l',&'l',&'o'].map((c)&=&&{&&&&return&(&span&{c}&/span&);
其他还有很多,具体可以参照
我是一个强烈地Less依赖患者,脱离了Less直接写CSS就会出现四肢乏力、不想干活、心情烦躁等现象,而且还不喜欢在写Less时候加前缀,平常都是gulp+less+autoprefixer直接处理的,那么在Webpack组织的React组件中要怎么写呢?
没错,依旧是使用loader
可以在webpack.config.js的loaders中增加Less的配置:
&&test:&/\.less$/,
&&loader:&'style-loader!css-loader!autoprefixer-loader!less-loader'}
通过这样的配置,就可以直接在模块代码中引入Less样式了:
import&React&from&'react';require('./HelloWorldComponent.less');
export&default&class&HelloWorldComponent&extends&ponent&{
&&&&constructor()&{
&&&&&&&&super();&&&&&&&&this.state&=&{};
&&&&render()&{&&&&&&&&return&(&div&Hello&World&/div&);
Webpack的loader为React组件化提供了很多帮助,像图片也提供了相关的loader:
{&test:&/\.png$/,&loader:&"url-loader?mimetype=image/png"&}
更多地loader可以移步
在Webpack下实时调试React组件
Webpack和React结合的另一个强大的地方就是,在修改了组件源码之后,不刷新页面就能把修改同步到页面上。这里需要用到两个库webpack-dev-server和react-hot-loader。
首先需要安装这两个库,npm install --save-dev webpack-dev-server react-hot-loader
安装完成后,就要开始配置了,首先需要修改entry配置:
&&helloworld:&[&&&&'webpack-dev-server/client?http://localhost:3000',&&&&'webpack/hot/only-dev-server',&&&&'./helloworld'
通过这种方式指定资源热启动对应的服务器,然后需要配置react-hot-loader到loaders的配置当中,比如我的所有组件代码全部放在scripts文件夹下:
&&test:&/\.js?$/,
&&loaders:&['react-hot',&'babel'],
&&include:&[path.join(__dirname,&'scripts')]
最后配置一下plugins,加上热替换的插件和防止报错的插件:
plugins:&[&&new&webpack.HotModuleReplacementPlugin(),&&new&webpack.NoErrorsPlugin()
这样配置就完成了,但是现在要调试需要启动一个服务器,而且之前配置里映射到http://localhost:3000,所以就在本地3000端口起个服务器吧,在项目根目录下面建个server.js:
var&webpack&=&require('webpack');var&WebpackDevServer&=&require('webpack-dev-server');var&config&=&require('./webpack.config');new&WebpackDevServer(webpack(config),&{
&&publicPath:&config.output.publicPath,
&&hot:&true,
&&historyApiFallback:&true}).listen(3000,&'localhost',&function&(err,&result)&{&&if&(err)&console.log(err);&&console.log('Listening&at&localhost:3000');
这样就可以在本地3000端口开启调试服务器了,比如我的页面是根目录下地index.html,就可以直接通过http://localhost:3000/index.html访问页面,修改React组件后页面也会被同步修改,这里貌似使用了websocket来同步数据。图是一个简单的效果:
React的组件化开发很有想法,而Webpack使得React组件编写和管理更加方便,这里只涉及到了React和Webpack得很小一部分,还有更多的最佳实践有待在学习的路上不断发掘
人打赏支持
码字总数 90636
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我在使用react的时候用es6特性,使用babel转码。诸如class之类的语法都可以使用,但是唯独es6的模块import export不能使用,只好用commonjs的require exports,这是为什么?是我的webpack配置不对么?我下载下来的redux的例子都是用es6模块写的,webpack能编。贴一下webpack.config.js
var webpack = require('webpack');
var commonsPlugin = new monsChunkPlugin('common.js')
var srcPath = './src/';
module.exports = {
entry: srcPath + 'index.js',
path: './build/',
filename: '[name].bundle.js'
loaders: [{
test: /\.js$/,
loaders: [ 'babel' ],
exclude: /node_modules/,
include: __dirname
test: /\.css?$/,
loaders: [ 'style', 'raw' ],
include: __dirname
plugins: [
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin()
resolve: {
extensions: ['', '.js', '.jsx', '.json', '.css'],
root: ['./node_modules']
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
另外 对于 ES6 语法
安装 babel-preset-es2015
npm install babel-preset-es2015 --save-dev
上面文章中的配置是在 package.json中配置 query
也可以在项目根目录下 添加配置文件
"presets": [
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App10293人阅读
前端工具(7)
本文主要介绍webpack的基本原理以及基于webpack搭建前端项目工程化解决方案的思路。
为什么要用webpack
webpack的安装
webpack的配置
github上的小例子
1、webpack入门
Webpack将项目中用到的一切静态资源都视之为模块,模块之间可以互相依赖。Webpack对它们进行统一的管理以及打包发布,其官方主页用下面这张图来说明Webpack的作用:
&&&&&&&&Webpack的目标就是对项目中的静态资源进行统一管理,为产品的最终发布提供最优的打包部署方案。
Webpack出自facebook的Instagram团队,在网上找到了比较好的对它主要特性的归纳,如下:
webpack 是以 commonJS 的形式来书写脚本滴,但对 AMD/CMD 的支持也很全面,方便旧项目进行代码迁移。
能被模块化的不仅仅是 JS 了。
开发便捷,能替代部分 grunt/gulp 的工作,比如打包、压缩混淆、图片转base64等。
扩展性强,插件机制完善,特别是支持 React 热插拔(见 react-hot-loader )的功能让人眼前一亮。
2、webpack的安装
首先,建立目录文件,这里为了介绍方便,建立一个简单的如下的目录:
/web根目录
index.html
webpack.config.js
&&&&&&&&es6 里面存放的是 ES6 风格的代码,main.js 是入口文件, index.html 是首页, webpack.config.js 是 webpack 的配置文件。
首先要安装node,接着在命令行,进入你的目录,输入如下命令:
npm install webpack -g
npm install webpack --sava-dev
使用 babel 对 ES6 风格的代码进行转换,所以要安装babel-loader 加载器,在命令行输入如下命令:
npm install babel-loader --save-dev
npm install babel-preset-es2015 --sava-dev
3、webpack配置
打开 webpack.config.js,编辑如下:
var path = require('path');
module.exports = {
entry: "./es6/main.js",//入口文件
output: {//打包输出的文件
path: __dirname,
filename: "bundle.js"
loaders: [
test: path.join(__dirname, 'es6'),
loader: 'babel-loader',
presets: ['es2015']
resolve: {// 现在你require文件的时候可以直接使用require('file'),不用使用require('file.coffee')
extensions: ['', '.js', '.json', '.coffee']
module.exports导出的对象即是 webpack 的配置对象,其中:
entry 是入口文件
output 是输出文件,这里的 filename 给的是 bundle.js,也就是当 webpack 运行完之后将生成一个 bundle.js 文件
loaders 是使用到的所有加载器,在 gulp 里面我们都是使用的是 gulp 的一些插件比如 gulp-rename、gulp-concat 等等,在 webpack 里面类似,使用的是各种 loaders,详细的 loaders 列表在 。
4、相关代码
/es6/main.js
import Person from './Person.js';
let p = new Person ('张三',20);
document.write(p.say());
index.html
在这里就可以直接引用 bundle.js 了。
&!DOCTYPE html&
charset="utf-8"/&
&测试页面&
src="bundle.js"&&
详情请移步github
我最初接触webpack是因为之前在实习的时候,要用react,当时接触过webpak,当时的配置是师父配置的,具体配置见
附上我个人觉着不错的入门教程:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:187848次
积分:2923
积分:2923
排名:第11873名
原创:102篇
评论:120条
(2)(2)(4)(1)(1)(3)(8)(13)(12)(11)(13)(11)(12)(15)

我要回帖

更多关于 gulp babel es6 转化 的文章

 

随机推荐