| 164 | * @param {Array} files {code: string, filename: string}[] |
| 165 | */ |
| 166 | const evalCode = async (files) => { |
| 167 | if (files.length === 0) { |
| 168 | return; |
| 169 | } |
| 170 | |
| 171 | const evalFiles = _.cloneDeep(files); |
| 172 | |
| 173 | // 依赖 |
| 174 | let deps = []; |
| 175 | |
| 176 | for (let file of evalFiles) { |
| 177 | const filename = file.filename; |
| 178 | |
| 179 | if (filename.endsWith('.js') || filename.endsWith('.jsx')) { |
| 180 | const result = Babel.transform(file.code, { |
| 181 | presets: ['env', 'react'], |
| 182 | sourceMaps: 'inline' |
| 183 | }); |
| 184 | file.evalCode = result.code; |
| 185 | const fileDeps = gatherDeps(result.code); |
| 186 | deps = deps.concat(fileDeps); |
| 187 | } |
| 188 | |
| 189 | if (filename.endsWith('.less')) { |
| 190 | const output = await less.render( |
| 191 | file.code, |
| 192 | { |
| 193 | plugins: [ |
| 194 | new LocalFileManagerPlugin(files) |
| 195 | ] |
| 196 | } |
| 197 | ); |
| 198 | file.evalCode = wrapCss(output.css); |
| 199 | } |
| 200 | |
| 201 | if (filename.endsWith('.css')) { |
| 202 | file.evalCode = wrapCss(file.code); |
| 203 | } |
| 204 | |
| 205 | if (!file.evalCode) { |
| 206 | continue; |
| 207 | } |
| 208 | |
| 209 | // eslint-disable-next-line |
| 210 | file.func = (module, exports, require) => eval(file.evalCode); |
| 211 | } |
| 212 | |
| 213 | const entry = evalFiles.find(f => f.filename === 'index.jsx'); |
| 214 | let cache = {}; |
| 215 | try { |
| 216 | cache = await loadDpes(deps); |
| 217 | } catch (e) { |
| 218 | // eslint-disable-next-line |
| 219 | console.log('load deps failed', e); |
| 220 | } |
| 221 | |
| 222 | runModule(entry, {...cache}, evalFiles); |
| 223 | }; |