egg如何配置可以编译ES6语法

Created on 8 Mar 2017  ·  17Comments  ·  Source: eggjs/egg

请问egg如何配置可以编译ES6语法及less/sass预编译工具

question

Most helpful comment

egg 如何支持 es6 的 import export

All 17 comments

egg 使用 node6,不需要编译。

less 这些预编译属于前端范畴,跟 egg 关系不大,你可以自己启动 webpack 去 watch 并编译前端代码。

后端代码无需编译,也不建议编译。

webpack 和 egg 的结合那里,唯一的用处就是在 agent 里面启动一个 webpack 的 static server 来做静态资源的引用,这个我们内部有一些实践,但还没有最佳实践可以开源出来。

egg 如何支持 es6 的 import export

启动一个 webpack 的 static server 来做静态资源的引用

这个插件近期会开源出来吗。感觉egg的周边生态还是有点弱啊。有点伤😅
@atian25

@xjchenhao 可以看看我这个,集成 neutrino。不过还不是最佳实践~
https://github.com/okoala/egg-neutrino

我配置了webpackHotMiddleware,问题解决了。就是实现起来不科学,需要你们框架提供一下支持。先贴代码。

//app.js
let webpack = require('webpack');
let webpackDevMiddleware = require('koa-webpack-dev-middleware');
let webpackHotMiddleware = require('koa-webpack-hot-middleware');
let devConfig = require('./config/webpack.config.js');

module.exports = app => {
    if(app.config.env=='local'){
        let compiler = webpack(devConfig);

        app.use(webpackDevMiddleware(compiler, {
            noInfo: true,
            publicPath: devConfig.output.publicPath
        }));
        app.use(webpackHotMiddleware(compiler));
    }
};

//package.json
  "devDependencies": {
    "babel-loader": "^7.0.0",
    "css-loader": "^0.28.1",
    "koa-webpack-dev-middleware": "^1.4.5",
    "koa-webpack-hot-middleware": "^1.0.3",
    "style-loader": "^0.17.0",
    "webpack": "^2.5.1"
  },
//config/webpack.config.js
var path = require('path'),
    webpack = require('webpack'),
    glob = require('glob'),
    ExtractTextPlugin = require("extract-text-webpack-plugin"),
    commander = require('commander');

// 生成入口文件的map
var entryObj = glob.sync(path.join(__dirname, '../app/public/script/page/**/**.js')),
    entryReg = /(.*\/page\/)(.*)\.js/i,
    formatEntry = {},
    hotMiddlewareScript = 'webpack-hot-middleware/client?reload=true';

entryObj.forEach(function (val) {
    if (entryReg.test(val)) {

        formatEntry[RegExp.$2] = [val];

        //     formatEntry[RegExp.$2].push(hotMiddlewareScript);
    }
});

console.log(path.join(__dirname, "../app/public/libs/jquery/dist/jquery.min.js"))

module.exports = {
    //页面入口文件配置
    //entry: formatEntry,
    entry: Object.assign(formatEntry, {
        common: ['jquery']
    }),

    //入口文件输出配置
    output: {
        path: path.join(__dirname, '../app/public/script/pkg'),
        filename: '[name].js',
        publicPath: '/script/pkg'
    },
    module: {
        //加载器配置
        rules: [
            {
                test: /\.css$/,
                use: ExtractTextPlugin.extract({
                    fallback: "style-loader",
                    use: "css-loader"
                })
            },
            {test: /\.(jpe?g|gif|png)$/, loader: 'url-loader?limit=100000'},
            {
                test: /\.woff|\.woff2|\.svg|.eot|\.ttf/,
                loader: 'url?prefix=font/&limit=10000'
            },
            {
                // use vue-loader for *.vue files
                test: /\.vue$/,
                loader: 'vue'
            },
            // {test: require.resolve(path.join(__dirname, '../app/public/libs/jquery/dist/jquery.min.js')), loader: 'expose?jQuery'},
            {
                test: /\.js$/,
                loader: 'babel-loader'
            }
        ]
    },
    //插件项
    plugins: [
        new webpack.ProvidePlugin({
            "$": "jquery",
            "jQuery": "jquery",
            "window.jQuery": "jquery"
        }),
        new ExtractTextPlugin("styles.css"),
        new webpack.optimize.OccurrenceOrderPlugin(),
        new webpack.HotModuleReplacementPlugin(),
        new webpack.NoEmitOnErrorsPlugin(),
        new webpack.optimize.CommonsChunkPlugin({
            name: 'vendor',
            minChunks: function (module, count) {
                // any required modules inside node_modules are extracted to vendor
                return (
                    module.resource &&
                    /\.js$/.test(module.resource) &&
                    module.resource.indexOf(
                        path.join(__dirname, '../node_modules')
                    ) === 0
                )
            }
        }),
        new webpack.optimize.CommonsChunkPlugin({
            name: 'vendor.min',
            chunks: ['vendor','common']
        }),
        //外部模块分隔
        new webpack.DefinePlugin({
            "require.specified": "require.resolve"
        })
    ],
    //其它解决方案配置
    resolve: {
        modules: [
            path.join(__dirname, "../app/public/libs/")
        ],
        extensions: ['.js', '.json'],
        alias: {
            module: path.join(__dirname, '../app/public/script/module/'),
            page: path.join(__dirname, '../app/public/script/page/'),
            libs: path.join(__dirname, '../static/libs/'),

            jquery: path.join(__dirname, "../app/public/libs/jquery/dist/jquery.js")
        }
    }
};

你们也看到了,app.js上用app.config.env判断环境。能否像中间件的config配置的那种机制提供接口。
@okoala @atian25

我尝试过在中间件中增加相关代码,但是貌似每次请求文件都会编译一次webpack。且大概率出现下面截图的报错。

核心的webpack配置文件跟上面代码是一样的。

下面是中间件的代码配置。

//config/config.local.js
'use strict';

module.exports = appInfo => {
    const config = {};

    config.middleware=[ 'webpack' ];

    return config;
};

//middleware/webpack.js
var webpack = require('webpack');
var webpackDevMiddleware = require('koa-webpack-dev-middleware');
var webpackHotMiddleware = require('koa-webpack-hot-middleware');
let devConfig = require('./../../config/webpack.config.js');

let compiler = webpack(devConfig);
module.exports = options => {
    return function* webpack(next) {
        yield next;

        this.app.use(webpackDevMiddleware(compiler, {
            noInfo: true,
            publicPath: devConfig.output.publicPath
        }));
        this.app.use(webpackHotMiddleware(compiler));
    };
};


image

写了一个插件,完成了这个需求,就几行代码。egg-webpack-middleware。第一次写egg插件,开心😄🎉

//config.local.js
'use strict';

let devConfig = require('./../config/webpack.config');

module.exports = appInfo => {
    const config = {};

    config.webpackMiddleware = devConfig;

    return config;
};

还是希望不通过插件实现这个功能,给app.js也做个app.local.jsapp.prod.js这样的配置覆盖。

@atian25

@xjchenhao app.js 并不是配置,而且这类的功能,肯定是通过插件的方式实现的,因为不是所有的项目都会用到 webpack。 egg 是 微内核 + 插件 的架构,除非 webpack 未来统一天下,否则这类插件不可能会内置到 egg,你可以在你的上层框架那里封装内置。

同问egg 如何配置支持 es6 的 import export
我是看了你们这篇文章来的
http://taobaofed.org/blog/2016/01/07/find-back-the-lost-es6-features-in-nodejs/

但是项目是用 egg-bin 启动的,不知道怎么改

同问,这个问题非常更尴尬。egg 如何配置支持 es6 的 import export

@369857519 我现在已经不纠结这个了, service 可以直接访问到,基本没有import的需求了

@lerry 但是真的有一些模块是需要引入的,不是所有的东西都在service中
8.11.1仍然不行

@hezhongfeng 通过 loader 来加载即可。

@369857519 import 还是不成熟的特性,没必要用。

我参照Babel稳定配置了以下,跑起来报了这个

Class constructor BaseContextClass cannot be invoked without 'new'

registry https://github.com/IEfucker/q-egg/tree/babel

cnpm install babel-register -D。再照这个配置来:
https://github.com/eggjs/egg/issues/1489#issuecomment-334625675
就可以使用 import了。

Was this page helpful?
0 / 5 - 0 ratings